请查看以下代码 -
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时和我们不在的时候发生的事情。
答案 0 :(得分:1)
当您将参数传递给具有ref
关键字的方法时,无论您在方法中执行什么操作,它们都会反映回实际参数。在方法GO
中,您将参数设置为null
。因此,对象ob
在Console.WriteLine
之前的值为null,因此为空引用异常。
在相反的情况下,当您调用不带ref
关键字的方法时,ob
变量中存储的引用副本将传递给方法的obj
参数。因此,程序堆栈中两个不同变量的ob
和obj
都指向堆中的相同内存位置。这就是你能够在方法中修改x
的值的方法。但是,将obj
的值设置为null
不会更改ob
的值。因此这里没有空引用异常。