参考类型与值类型
我正在阅读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";
显然会影响原始对象。