传递价值与传递参考

时间:2015-10-21 03:09:37

标签: c# pass-by-reference pass-by-value

我们在测验中得到了这个问题,而我很难理解它。

void EmptyStudent(Student s)
{
     s.Name = "";
     s.Major = "Undeclared";
     s.ID = "None";
}

EmptyStudent(objStudent);

“假设变量objstudent包含名称”John Doe“,major为”IST“,并且在调用方法之前id为”1001“,objStudent的内容在调用之后会是什么?”

有人可以向我解释一下。我认为它仍然是“John Doe”,“IST”和“1001”,因为它正在传递价值。由于它是通过值传递的,一旦你离开方法,变量不会保持不变吗?

1 个答案:

答案 0 :(得分:2)

由于值已更改,我假设postgresql.conf是一个类而不是结构。

类是引用类型。将它们传递给方法时,您将传递对同一对象的引用。

您需要将Students视为指向同一对象的两个不同引用。

结构的行为有所不同,当您将结构传递给方法时,会创建结构的克隆并将其传递给方法。

请注意,如果您将方法更改为:

objStudent

然后void EmptyStudent(Student s) { s = new Student(); s.Name = ""; s.Major = "Undeclared"; s.ID = "None"; } 的内容不会改变。这是因为objStudents是两个不同的引用,现在指向两个不同的对象。

要使objStudentobjStudent具有完全相同的引用(如同一个引用的两个别名),那么您需要像这样通过引用传递:

s

在这种情况下,在方法调用之后,void EmptyStudent(ref Student s) { s = new Student(); s.Name = ""; s.Major = "Undeclared"; s.ID = "None"; } EmptyStudent(ref objStudent); 将指向新创建的对象,因此将更改其内容。