C# 获取对象的意外值

C# 获取对象的意外值,c#,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

请参阅以下代码-

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;
  }
}

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

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


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

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