按值传递与按引用传递

Passing by value vs. Passing by reference

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

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

EmptyStudent(objStudent);

"Assume the variable objstudent contains the name "李四",major是"IST",方法调用前id是"1001",调用后objStudent的内容是什么?"

谁能给我解释一下。我认为它仍然是 "John Doe"、"IST" 和“1001”,因为它是按值传递的。既然是按值传递,那么一旦你离开方法,变量不就保持不变了吗?

由于值发生了变化,我假设 Student 是一个 class 而不是一个结构。

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

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

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

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

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

那么objStudent的内容就不会变了。这是因为 sobjStudent 是两个不同的引用,现在指向两个不同的对象。

要使 objStudents 成为完全相同的引用(就像同一引用的两个别名),则需要像这样通过引用传递:

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

EmptyStudent(ref objStudent);

在这种情况下,在方法调用之后,objStudent 将指向新创建的对象,因此其内容将发生变化。