关于c#:获取对象的意外值


Getting Unexpected value of an object

本问题已经有最佳答案,请猛点这里访问。

请看下面的代码-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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时和不使用REF时这里发生了什么。


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

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