Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过值传递与通过引用传递_C#_Pass By Reference_Pass By Value - Fatal编程技术网

C# 通过值传递与通过引用传递

C# 通过值传递与通过引用传递,c#,pass-by-reference,pass-by-value,C#,Pass By Reference,Pass By Value,我们在一次测验中被问到这个问题,我很难理解它 void EmptyStudent(Student s) { s.Name = ""; s.Major = "Undeclared"; s.ID = "None"; } EmptyStudent(objStudent); 假设变量objstudent在调用方法之前包含名称“John Doe”,major是“IST”,id是“1001”,那么调用之后objstudent的内容是什么 有人能给我解释一下吗。我认为它仍然是

我们在一次测验中被问到这个问题,我很难理解它

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

EmptyStudent(objStudent);
假设变量objstudent在调用方法之前包含名称“John Doe”,major是“IST”,id是“1001”,那么调用之后objstudent的内容是什么


有人能给我解释一下吗。我认为它仍然是“johndoe”、“IST”和“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
将指向新创建的对象,因此将更改其内容。

@Claies primitives和
struct
s。不要告诉人们错误的知识。很抱歉,我知道了,我的评论有点快。我没有看到经常使用结构,它们往往会跳过我的大脑。。。不管怎样,我删除了不正确的评论。你的问题缺少信息。它是一个
结构
还是一个
?没有这些信息,就没有明确的答案。你可能应该给你的测验的创造者留个便条,因为这是一个糟糕的问题,我假设它是一门课。但我在上面写的是我们为这个问题所得到的一切。这不是真的。示例代码确实按值传递,但它是对象的地址值。在这里,把它称为“参考传递”是很容易产生误解的。通过引用传递严格使用“&”运算符。@Krypton是“&”运算符吗?仅适用于非托管类型。在C#中,有
ref
关键字。@Krypton,我在哪里叫它“通过引用传递”?你是说我的代码> REF< /Cube >例子?是的,实际上,我把它看作C++。但这是同一个概念,当然。我没有说任何相反的话。