2015-10-21 186 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'例子中? –