按值传递 vs 按引用传递

3
我们在一次测验中遇到了这个问题,我很难理解它。
void EmptyStudent(Student s)
{
     s.Name = "";
     s.Major = "Undeclared";
     s.ID = "None";
}

EmptyStudent(objStudent);

假设在调用该方法之前,变量objstudent包含姓名“John Doe”,专业是“IST”,ID为“1001”,那么调用后,objStudent的内容将会是什么?
有人能给我解释一下吗?我认为它仍然是“John Doe”,“IST”和“1001”,因为它是按值传递的。由于是按值传递,一旦离开方法,变量不会改变。

1
@Claies 原语和 struct - Sergey Kalinichenko
1
不要向人们传授错误的知识。 - Krypton
1
抱歉,我知道了,只是有点着急发表评论。我很少看到使用结构体,它们往往会被忽略...无论如何,我已经删除了不正确的评论。 - Claies
你的问题缺少信息。它是一个“struct”还是一个“class”?没有这些信息,就没有明确的答案。你应该给你的测验创建者留个便条,因为这是一个糟糕的问题。 - Rob
我会假设这是一个类。但是上面我写的就是我们在问题中得到的全部信息。 - Alex
学生对象在方法外没有改变。 - dan
1个回答

3
自从值发生改变后,我认为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将指向新创建的对象,并因此更改其内容。

@Krypton '&' 运算符?仅适用于非托管类型。在 C# 中,有 ref 关键字。 - Rob
1
@Krypton,你在哪里称它为“通过引用传递”?你是指我的ref示例吗? - Yacoub Massad
1
当然。我没有说相反的话。 - Yacoub Massad
在这种情况下,“引用”指的是“引用类型的变量”。 - Yacoub Massad
@Krypton ref和指针并不是完全相同的概念。它们通过两种截然不同的方式实现类似的结果。你没有复制内存的事实只是一个副作用。 - Qix - MONICA WAS MISTREATED
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接