按值传递与按引用传递
本文关键字:按引用传递 按值传递 | 更新日期: 2023-09-27 18:18:40
我们在一次测验中遇到了这个问题,我很难理解。
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"answers"1001",因为它是按值传递的。因为它是按值传递的,一旦你离开方法,变量不会保持不变吗?由于值发生了变化,我假设Student
是一个类而不是一个结构体。
您需要将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
将指向新创建的对象,因此将更改其内容。