我正在阅读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()
并将person.Firstname
的值更改为Alice
时,更改将反映在原始人员对象上,并进行实例化在Program.Main()
这是我期望的,p
参数是对person
的引用。但是,当我尝试将p
设置为null
时,似乎没有任何变化。这是为什么?
答案 0 :(得分:3)
您将引用的副本设置为null,这不会影响原始值。
类似于(在C ++中)
Person * myPtr = new Person();
NullFunc(myPtr);
public NullFunc(Person * ptr)
{
ptr = null;
}
引用有效地通过值传递,您无法对其进行更改。但是,您可以更改它指向的对象的属性:
ptr->Name = "Bob";
明显影响原始对象。
答案 1 :(得分:3)
当你"通过引用"您确实传递了引用的副本,因此将该引用设置为指向另一个对象(或null)不会影响原始引用。但是,如果通过取消引用指针副本来更改对象的属性,则调用者将看到这些更改。
如果您想真正通过引用传递并使kill方法有效,可以添加ref
关键字:
public void Kill(ref Person p)
{
p = null;
}