2015-10-21 149 views
2

我们在测验中给出了这个问题,我很难理解它。按值传递与传递参考

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

EmptyStudent(objStudent); 

“假设变量objstudent包含名称‘李四’,主要是‘IST’,id是‘1001’的调用方法之前,会有什么objStudent的内容是电话后? “

有人可以向我解释这一点。我认为它仍然是“John Doe”,“IST”和“1001”,因为它正在传递价值。既然它传递了价值,一旦你离开这个方法,变量不会保持不变吗?

+1

@Claies原语和'结构'。 – dasblinkenlight

+1

不要告诉别人错误的知识。 – Krypton

+1

对不起,我知道,我的评论只是有点快。我没有看到经常使用的结构,他们倾向于跳过我的想法......无论如何,我删除了不正确的评论。 – Claies

回答

2

由于值改变了,我假设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将指向新创建的对象,因此将更改其内容。

+0

这不是真的。示例代码确实按值传递,但它是该对象的地址值。通过引用来传递它在这里是非常具有误导性的。按引用传递严格使用“&”运算符。 – Krypton

+0

@Krypton'&'运算符?仅适用于非托管类型。在C#中,有'ref'关键字。 – Rob

+1

@Krypton,我在哪里称它为“通过参考”?你的意思是在我的'ref'例子中? –