按值传递与按引用传递
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 而不是一个结构。
类 是引用类型。当您将它们传递给方法时,您传递的是对同一对象的引用。
您需要将 s
和 objStudent
视为指向同一对象的两个不同引用。
结构的行为不同,当您将结构传递给方法时,会创建该结构的克隆并将其传递给该方法。
请注意,如果您将方法更改为此:
void EmptyStudent(Student s)
{
s = new Student();
s.Name = "";
s.Major = "Undeclared";
s.ID = "None";
}
那么objStudent
的内容就不会变了。这是因为 s
和 objStudent
是两个不同的引用,现在指向两个不同的对象。
要使 objStudent
和 s
成为完全相同的引用(就像同一引用的两个别名),则需要像这样通过引用传递:
void EmptyStudent(ref Student s)
{
s = new Student();
s.Name = "";
s.Major = "Undeclared";
s.ID = "None";
}
EmptyStudent(ref objStudent);
在这种情况下,在方法调用之后,objStudent
将指向新创建的对象,因此其内容将发生变化。
我们在测验中遇到了这个问题,我很难理解它。
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 而不是一个结构。
类 是引用类型。当您将它们传递给方法时,您传递的是对同一对象的引用。
您需要将 s
和 objStudent
视为指向同一对象的两个不同引用。
结构的行为不同,当您将结构传递给方法时,会创建该结构的克隆并将其传递给该方法。
请注意,如果您将方法更改为此:
void EmptyStudent(Student s)
{
s = new Student();
s.Name = "";
s.Major = "Undeclared";
s.ID = "None";
}
那么objStudent
的内容就不会变了。这是因为 s
和 objStudent
是两个不同的引用,现在指向两个不同的对象。
要使 objStudent
和 s
成为完全相同的引用(就像同一引用的两个别名),则需要像这样通过引用传递:
void EmptyStudent(ref Student s)
{
s = new Student();
s.Name = "";
s.Major = "Undeclared";
s.ID = "None";
}
EmptyStudent(ref objStudent);
在这种情况下,在方法调用之后,objStudent
将指向新创建的对象,因此其内容将发生变化。