一個結構
struct Data { int a; int b; }
一個包含結構
當我現在實例我的課課,我假設結構住在堆。 如果我現在要做類似
SomeClass.Process(new Packet().DataStruct);
SomeClass.Process(new Packet().DataStruct.a);
它會作爲值傳遞嗎?
如果沒有,是否有任何理由不把結構變成一個類呢?
一個結構
struct Data { int a; int b; }
一個包含結構
當我現在實例我的課課,我假設結構住在堆。 如果我現在要做類似
SomeClass.Process(new Packet().DataStruct);
SomeClass.Process(new Packet().DataStruct.a);
它會作爲值傳遞嗎?
如果沒有,是否有任何理由不把結構變成一個類呢?
struct
s是值類型,所以它將作爲value
傳遞。 Classes
是reference
類型。
除非指定了out
或ref
,否則一切都將作爲value
傳遞。
通過值傳遞類引用,除非它是通過引用傳遞引用時的「out」或「ref」。 – 2011-02-16 10:09:26
我明白了。所以,如果我有這樣的東西:`c = new C(); a = c;`_reference_ to`c`被複制到`a`中? while`b = new Struct(); a = b`我實際上覆制了數據本身。 – lejon 2011-02-16 10:22:57
結構總是按值傳遞。換句話說,它的副本被創建並提供給被調用函數。
雖然struct被分配在堆上,但它實際上是它所包含的類的一部分,而不是作爲一個單獨的實體。
結構的一個實例駐留在堆或棧上的事實根本不相關。很高興知道它將活在微軟實施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);
這裏有個訣竅:只是忘了堆和堆棧。引用類型被視爲引用,值類型被視爲值。而已。 – 2011-02-16 10:08:35