按值传递与按引用传递

本文关键字:按引用传递 按值传递 | 更新日期: 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是一个类而不是一个结构体。

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

您需要将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将指向新创建的对象,因此将更改其内容。