1.什么是Union類型數據 聯合(Union)是一種特殊的類,一個聯合中的數據成員在內存中的存儲是互相重疊的。每個數據成員都在相同的內存地址開始。 分配給聯合的存儲區數量是“要包含它最大的數據成員”所需的內存數。同一時刻只有一個成員可以被賦給一個值。
C++中表達Union類型數據

union TokenValue { char _cval; int _ival; double _dval; };
2.Union類型數據的內存使用情況 Union類型數據的分配是以最大的成員變量為准,也就是說上述union內存大小為sizeof(double)=8
3.在C#中,要指定成員的內存布局情況,我們需要結合使用StructLayoutAttribute特性,LayoutKind枚舉和FieldOffsetAttribute特性, 它們都位於System.Runtime.InteropServices命名空間中。
//C#中模擬C++中Union類型數據

[StructLayout(LayoutKind.Explicit, Size=8)] struct TokenValue { [FieldOffset(0)] public char _cval; [FieldOffset(0)] public int _ival; [FieldOffset(0)] public double _dval; }
我們知道,聯合的每個數據成員都在相同的內存地址開始,通過把[FieldOffset(0)]應用到TokenValue的每一個成員,我們就指定了這些成員都處於同一起始位置。 當然,我們得事先告訴.NET這些成員的內存布局由我們來作主,把LayoutKind.Explicit枚舉傳遞給StructLayoutAttribute特性的構造函數,並應用到TokenValue,.NET就不會再干涉該struct的成員在內存中的布局了。 另外,我顯式的把TokenValue的大小設置為8字節,當然,這樣做是可選的。
lock使用注意: 1.lock不要應用在public類型的數據之上,如lock(this) 2.lock不要應用在字符串上,.NET中程序域中所有內容相同的字符串,是同一個實例 3.lock不能lock 空對象