C# 获取对象的意外值
请参阅以下代码-C# 获取对象的意外值,c#,C#,请参阅以下代码- public class Program { public static void Main() { A ob = new A(); ob.x = 120; ob.Name = "No"; GO(ob); Console.WriteLine(ob.x); } public static void GO(A obj) { obj.x = 50; obj.Name = "Local"; obj
public class Program
{
public static void Main()
{
A ob = new A();
ob.x = 120;
ob.Name = "No";
GO(ob);
Console.WriteLine(ob.x);
}
public static void GO(A obj)
{
obj.x = 50;
obj.Name = "Local";
obj = null;
}
}
在控制台中,它打印x50的值。但当我使用ref关键字时,它给出了null引用异常。我的问题是,若对象是引用类型,那个么即使我不使用ref,它也应该给出null引用异常。若不是,那个么控制台中的x值应该是120。我无法理解这种行为。请解释当我们使用ref和不使用ref时会发生什么情况。当您将参数传递给带有
ref
关键字的方法时,您在方法内执行的任何操作都会反映回实际参数。在方法GO
中,您将参数设置为null
。因此对象ob
在Console.WriteLine
之前的值为null,因此出现null引用异常
同样在相反的情况下,当您调用不带
ref
关键字的方法时,存储在ob
变量中的引用副本会传递给该方法的obj
参数。因此ob
和obj
都是程序堆栈中的两个不同变量,它们指向堆中相同的内存位置。这就是如何在方法内部修改x
的值。但是将obj
的值设置为null
不会更改ob
的值。因此这里没有空引用异常。您是正确的,但对象作为引用传递,即使不使用ref,这就是为什么x的值更改为50。但对象值并没有设置为null,控制台打印50而不是120。为什么?检查修改后的答案谢谢你的回答。。我也得到了一个更好的参考-