参考类型与值类型

我正在阅读C#中的结构和类,我的理解结构是值类型,类是引用类型。 但是当我们将类对象作为参数传递给方法时,我对它们的行为方式感到有些困惑。

假设我有以下代码:

public class Program { public static void Main(string[] args) { var program = new Program(); var person = new Person { Firstname = "Bob", }; Console.WriteLine(person.Firstname); program.ChangeName(person); Console.WriteLine(person.Firstname); program.Kill(person); Console.WriteLine(person.Firstname); Console.Read(); } public void ChangeName(Person p) { p.Firstname = "Alice"; } public void Kill(Person p) { p = null; } } 

当我将Person类的实例传递给Program.ChangeName()并将Program.ChangeName()的值更改为Alice ,更改将反映在我在Program.Main()实例化的原始person对象上,这是我所期望的, p参数是对person的引用。 但是,当我尝试将p设置为null ,似乎没有变化。 为什么是这样?

当您“通过引用传递”时,您实际上正在传递引用的副本,因此将该引用设置为指向另一个对象(或null)将不会影响原始引用。 但是,如果通过取消引用指针副本来更改对象的属性,则调用者将看到这些更改。

如果你想真正通过引用传递并使你的kill方法工作,你可以添加ref关键字:

 public void Kill(ref Person p) { p = null; } 

您将引用的副本设置为null,这不会影响原始值。

它类似于(在C ++中)

 Person * myPtr = new Person(); NullFunc(myPtr); public NullFunc(Person * ptr) { ptr = null; } 

引用有效地通过值传递,您无法更改它。 但是,您可以更改它指向的对象的属性:

 ptr->Name = "Bob"; 

显然会影响原始对象。