【问题标题】: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 和不使用时这里发生了什么。

【问题讨论】:

    标签: c#


    【解决方案1】:

    当您使用 ref 关键字将参数传递给方法时,您在方法内执行的任何操作都会反映回实际参数。在方法GO 中,您将参数设置为null。所以对象obConsole.WriteLine 之前的值为null,因此出现空引用异常。

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

    【讨论】:

    • 你是对的,但即使不使用 ref,对象也会作为引用传递,这就是为什么 x 的值更改为 50。但对象值没有设置为 null 并且控制台打印 50 而不是 120。为什么?
    • 检查修改后的答案
    • 感谢您的回答..我也得到了更好的参考-stackoverflow.com/questions/186891/…
    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 2023-02-04
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多