2011-02-16 17 views
5

我:類中的結構是否作爲值傳遞?

一個結構

struct Data { int a; int b; } 

一個包含結構

​​

當我現在實例我的課課,我假設結構住在堆。 如果我現在要做類似

SomeClass.Process(new Packet().DataStruct); 
SomeClass.Process(new Packet().DataStruct.a); 

它會作爲值傳遞嗎?

如果沒有,是否有任何理由不把結構變成一個類呢?

+1

這裏有個訣竅:只是忘了堆和堆棧。引用類型被視爲引用,值類型被視爲值。而已。 – 2011-02-16 10:08:35

回答

3

struct s是值類型,所以它將作爲value傳遞。 Classesreference類型。

除非指定了outref,否則一切都將作爲value傳遞。

+1

通過值傳遞類引用,除非它是通過引用傳遞引用時的「out」或「ref」。 – 2011-02-16 10:09:26

+0

我明白了。所以,如果我有這樣的東西:`c = new C(); a = c;`_reference_ to`c`被複制到`a`中? while`b = new Struct(); a = b`我實際上覆制了數據本身。 – lejon 2011-02-16 10:22:57

1

結構總是按值傳遞。換句話說,它的副本被創建並提供給被調用函數。

雖然struct被分配在堆上,但它實際上是它所包含的類的一部分,而不是作爲一個單獨的實體。

1

結構的一個實例駐留在堆或棧上的事實根本不相關。很高興知道它將活在微軟實施CLR的堆上,但這就是它的原因。這只是一個實現細節。

值類型(結構體)始終具有值語義。這不等於說,他們傳遞的價值,因爲它即使在沒有方法調用相關:

struct Data { public int a; public int b; } // Don't do this at home 
var x = new Data { a = 1, b = 42 }; // x.a == 1, x.b == 42 
var y = x; // x.a == 1, x.b == 42, y.a == 1, y.b == 42 
y.a = 2; // x.a == 1, y.a == 2 
var z = y; // x.a == 1, y.a == 2, z.a == 2 
z.a = 3; // x.a == 1, y.a == 2, z.a == 3 
// All variables hold a different copy of the struct 
Debug.Assert(x.a == 1); 
Debug.Assert(y.a == 2); 
Debug.Assert(z.a == 3); 

Debug.Assert(x.b == 42); 
Debug.Assert(y.b == 42); 
Debug.Assert(z.b == 42); 

(這一事實使得它一般一個壞主意,有可變的結構像一個。上面我用它只是爲了演示目的,不要做它真正的代碼保持你的值類型是不變的)

如果你有一個引用類型,你將有一個不同的圖片:。

class Data { public int a; } 
var x = new Data { a = 1 }; // x.a == 1 
var y = x; // x.a == 1, y.a == 1 
y.a = 2; // x.a == 2, y.a == 2 
var z = y; // x.a == 2, y.a == 2, z.a == 2 
z.a = 3; // x.a == 3, y.a == 3, z.a == 3 
// All variables hold a reference to the same object: 
Debug.Assert(x.a == 3); 
Debug.Assert(y.a == 3); 
Debug.Assert(z.a == 3);