获取对象的意外值[重复]
Posted
技术标签:
【中文标题】获取对象的意外值[重复]【英文标题】:Getting Unexpected value of an object [duplicate] 【发布时间】:2018-02-11 17:03:36 【问题描述】:请看下面的代码——
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;
在控制台中它打印 x 50 的值。但是当我使用 ref 关键字时,它给出了空引用异常。我的问题是如果对象是引用类型,即使我不使用引用,它也应该给出空引用异常。如果不是,那么控制台中 x 的值应该是 120。我无法理解这种行为。请解释当我们使用 ref 和不使用时这里发生了什么。
【问题讨论】:
【参考方案1】:当您使用 ref
关键字将参数传递给方法时,您在方法内执行的任何操作都会反映回实际参数。在方法GO
中,您将参数设置为null
。所以对象ob
在Console.WriteLine
之前的值为null,因此出现空引用异常。
同样在相反的情况下,当您调用没有ref
关键字的方法时,存储在ob
变量中的引用副本将传递给方法的obj
参数。所以ob
和obj
都是程序堆栈中的两个不同变量,它们都指向堆中的相同内存位置。这就是您能够在方法内修改x
值的方式。但是将obj
的值设置为null
不会改变ob
的值。因此这里没有空引用异常。
【讨论】:
你是对的,但即使不使用 ref,对象也会作为引用传递,这就是为什么 x 的值更改为 50。但对象值没有设置为 null 并且控制台打印 50 而不是 120。为什么? 检查修改后的答案 感谢您的回答..我也得到了更好的参考-***.com/questions/186891/…以上是关于获取对象的意外值[重复]的主要内容,如果未能解决你的问题,请参考以下文章