pass-by-reference-将对象从Main()传递到函数会更改对象,即使C#是按值传递的
本文关键字:对象 即使 按值传递 Main pass-by-reference- 函数 | 更新日期: 2023-09-27 17:59:22
考虑以下代码:
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方法的本地指针。