参考类型与值类型

时间:2014-06-06 19:47:30

标签: c# .net oop reference

我正在阅读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时,似乎没有任何变化。这是为什么?

2 个答案:

答案 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;
}