pass-by-reference-将对象从Main()传递到函数会更改对象,即使C#是按值传递的



考虑以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
    class Person
    {
        public Person(String name)
        {
            this.first = name;
        }

        private String first;
        public void setName(String name)
        {
            this.first = name;
        }
        public String getName()
        {
            return this.first;
        }
    }
    class Program
    {
        public static void changeName(Person per)
        {
            per.setName("Jack");
        }
        public static void changeToNull(Person per)
        {
            per = null;          
        }
        static void Main(string[] args)
        {
            Person p = new Person("David");
            Console.WriteLine(p.getName());
            changeName(p);
            Console.WriteLine(p.getName());
            changeToNull(p);
            Console.WriteLine(p.getName());
        }
    }
}

输出为:

David
Jack
Jack

根据我的理解,C#是按值的,那么为什么在将p传递给changeName()时,它也会更改Main()中的p,但当我将其设置为null时,它会保留Jack!?

Person是一个引用类型,因此当您将其作为值传递给changeName时,您真正传递的是指向内存中那个Person对象的指针(地址)。由于该指针是通过值传递的,因此您不能将其重新分配给Person的其他副本,但您可以调用该对象上可能更改其内部状态的方法。方法changeToNull的行为方式与此相同,因为指向Person-per的指针再次通过值传递。当您将per设置为null时,您只是在更改changeToNull方法的本地指针。

最新更新