2011-10-01 101 views
0

GetNode返回什麼,副本或對真實值的引用?C#函數的返回類型

public GraphNode GetNode(int idx) 
{ 
    return Nodes[idx]; 
} 

換句話說,這段代碼是否會改變真實值,或者它會改變從GetNode返回的副本?

GetNode(someIndex).ExtraInfo = something; 

感謝

回答

5

根據地方GraphNode是一個類或結構。如果是上課,你會改變「真實」價值。結構是相反的。

0

C#中類的工作方式是它們可以作爲指針傳遞。

您可以在其中設置值,就像您在示例中那樣,它會更改原始值。 雖然沒有包裝,但設置實際的類本身不能完成。

0

它將返回一個引用(如果GraphNode是一個類)到一個GraphNode對象,所以原始對象將被更改。

+3

你確定'GraphNode'是'class'嗎? – svick

3

這取決於您的定義GraphNode

如果它是(通過引用)它將返回相同的實例;

或者如果它是結構(值類型),那麼你會得到一個新的實例。

1

換句話說,這段代碼是否會改變實際值,或者它會改變從GetNode返回的副本 ?

GetNode(someIndex).ExtraInfo = something; 

如果GetNode()返回struct /值類型,你會真正得到在C#編譯錯誤:

不能修改的返回值 'GetNode(someIndex)',因爲它是 不一個變量

這正是因爲編譯器試圖保護你免於更改複製價值無處可去。你的例子只有在GetNode()返回一個引用類型時纔有意義。

獲得的例子就是編譯值類型的唯一方法是通過從屬性賦值分離的返回值檢索:作爲其他海報提到它不依賴於是否

var node = GetNode(someIndex); 
node.ExtraInfo = something; 

在這種情況下, GetNode()返回一個引用類型或值類型。對於引用類型,您正在更改GetNode()返回引用的原始類實例,對於正在修改新的複製實例的值類型。