C#實現union以及lock的使用


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

C++中表達Union類型數據

union TokenValue
{
    char _cval;
    int _ival;
    double _dval;
};
View Code

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;
}
View Code

我們知道,聯合的每個數據成員都在相同的內存地址開始,通過把[FieldOffset(0)]應用到TokenValue的每一個成員,我們就指定了這些成員都處於同一起始位置。 當然,我們得事先告訴.NET這些成員的內存布局由我們來作主,把LayoutKind.Explicit枚舉傳遞給StructLayoutAttribute特性的構造函數,並應用到TokenValue,.NET就不會再干涉該struct的成員在內存中的布局了。 另外,我顯式的把TokenValue的大小設置為8字節,當然,這樣做是可選的。

lock使用注意: 1.lock不要應用在public類型的數據之上,如lock(this) 2.lock不要應用在字符串上,.NET中程序域中所有內容相同的字符串,是同一個實例 3.lock不能lock 空對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM