获取对象的意外值[重复]

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。所以对象obConsole.WriteLine 之前的值为null,因此出现空引用异常。

同样在相反的情况下,当您调用没有ref 关键字的方法时,存储在ob 变量中的引用副本将传递给方法的obj 参数。所以obobj 都是程序堆栈中的两个不同变量,它们都指向堆中的相同内存位置。这就是您能够在方法内修改x 值的方式。但是将obj 的值设置为null 不会改变ob 的值。因此这里没有空引用异常。

【讨论】:

你是对的,但即使不使用 ref,对象也会作为引用传递,这就是为什么 x 的值更改为 50。但对象值没有设置为 null 并且控制台打印 50 而不是 120。为什么? 检查修改后的答案 感谢您的回答..我也得到了更好的参考-***.com/questions/186891/…

以上是关于获取对象的意外值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

共享指针的意外值[重复]

意外令牌:使用地图形成对象数组[重复]

将对象推送到对象数组导致整个数组发生意外更改[重复]

替换对象中键值对的Python函数返回意外输出[重复]

如何获取嵌套对象的默认值,包括零作为值[重复]

Object.keys() 从集合中返回 MongoDB 对象上的意外键 [重复]