参考类型与值类型
我正在阅读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";
显然会影响原始对象。
上述就是C#学习教程:参考类型与值类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013610.html