所以我深入阅读 Jon Skeet 的 C# 并遇到了一些误解,比如引用类型总是通过 ref 传递,所以我决定自己做一个小实验。
正如您在下面的代码中看到的,我有一个简单的 Car 类,其中一个属性在调用构造函数时初始化为 500。我还有 NullIt 函数,该函数将 null 分配给参数值,以及 SpeedUp 方法,该方法仅更改 Speed 属性值。
检查 main 方法,您可以看到我实例化了一个 Car 对象,然后将该对象传递给静态 SpeedUp 方法,并且 Speed 值更改为 1000,但当我将其传递给静态 NullIt 方法时,该对象保持不变。由此,我唯一可以假设的是对象是按值传递的,而字段/属性是按引用传递的。这是正确的吗?
我知道如果我使用 ref 关键字传递它将会返回 null。
class Program
{
static void Main(string[] args)
{
Car c = new Car();
Car.SpeedUP(c);
Car.NullIt(c);
}
class Car
{
public int Speed { get; set; }
public Car() { Speed = 500; }
public static void SpeedUP(Car c)
{
c.Speed = 1000;
}
public static void NullIt(Car c)
{
c = null;
}
}
}
由此我唯一可以假设的是该对象已通过
值和字段/属性通过引用传递。这是
正确的?
并不真地。对象的地址是按值传递的。
所以当你这样做时:
Car.SpeedUP(c);
现在你的方法参数SpeedUp
和你的领域c
在调用者中,两者都指向内存中的同一位置。从而改变了作品的属性。
但对于您的电话:
Car.NullIt(c);
你的方法参数c
和来电者的c
两者都指向同一位置。但是由于您将 null 分配给您的参数c
,现在它不指向任何内存位置,而是指向原始/调用者的c
仍然指向相同的内存位置。
考虑以下:
当您将参数传递给方法时,内存中的两个引用将指向相同的地址,如下所示:
但是当你分配null
它不会改变其他参考。
第一个参考(在呼叫者中)仍然指向相同的位置,只是方法参数现在指向null
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)