Csharp/C#教程:参考类型与值类型分享


参考类型与值类型

我正在阅读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

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐