这里,Person
是一个类,因此是一个引用类型,当我将它作为参数传递给另一个函数并在那里分配时,应该更改它。
调用program.person
后,为什么ChangePerson
为空?
namespace IndirectlyPropertySet
{
class Program
{
public Person _person;
public Person person
{
get { return _person; }
set
{
if (_person != value)
{
_person = value;
}
}
}
static void Main(string[] args)
{
Program program = new Program();
ChangePerson(program.person);
// Why program.person is null after executing this ?
program.person = new Person() { Name = "b", Age = 2 };
}
static void ChangePerson(Person p)
{
Person pe = new Person() { Name = "a", Age = 1 };
p = pe;
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
答案 0 :(得分:4)
作为对@ JonSkeet的回答的补充,如果你重写了代码来做这件事,那么它就会起作用。
static void ChangePerson(ref Person p)
{
Person pe = new Person() { Name = "a", Age = 1 };
p = pe;
}
void Main()
{
Person p = program.person;
ChangePerson(ref p);
// program.person will now be set to "a" with age 1 at this point
program.person = p;
program.person = new Person() { Name = "b", Age = 2 };
}
关键是通过引用传递引用类型 ,即将ref
关键字添加到参数中。
答案 1 :(得分:3)
为什么在调用ChangePerson后,program.person在这里为空?
参数(作为参考)正在按值传递。当您更改参数的值以引用其他对象时,这根本不会更改参数。请注意,在这种情况下,您甚至没有传递变量的值 - 您传递的是评估(命名错误的)属性的结果。
了解以下两者之间的区别非常重要:
请阅读我的article on parameter passing on C#了解详情。