获取对象的意外值

时间:2017-09-03 05:01:05

标签: 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 = null;
  }
}
在控制台中

它打印x 50的值。但是当我使用ref关键字时,它给出了空引用异常。我的问题是,如果对象是引用类型,它应该给出null引用异常,即使我不使用ref。如果不是那么控制台中x的值应为120.我无法理解这种行为。请解释当我们使用ref时和我们不在的时候发生的事情。

1 个答案:

答案 0 :(得分:1)

当您将参数传递给具有ref关键字的方法时,无论您在方法中执行什么操作,它们都会反映回实际参数。在方法GO中,您将参数设置为null。因此,对象obConsole.WriteLine之前的值为null,因此为空引用异常。

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