2015-11-04 73 views
1

考慮下面的代碼:靜態成員是否存儲在.NET中的固定位置?

class Foo 
{ 
    static readonly Guid guid = Guid.Parse("..."); 
} 

可以在初始化後的靜態​​場變化的基本地址?如果不是,該地址如何獲得?

常量呢?

注意:我明白引用類型通常可以由GC移動(無論是否存在具有對它們的句柄的靜態變量),但對於靜態值類型和常量它是如何工作的?

這個問題出現了,因爲我們正在研究一些需要與非託管API互操作的代碼,並且我們希望避免在HGlobal中執行額外的字節副本(如果它們已經在固定地址中)記憶開始。

我更感興趣的是瞭解CLI標準對此的看法(與具體的.NET實現確實如何,),因爲我更喜歡健壯的代碼,它不依賴於巧合的實現細節。

+0

您是在問.NET的當前實現,還是CLI標準允許實現者在底層做什麼? –

+1

[靜態類成員固定?]可能的重複?(http://stackoverflow.com/questions/33508517/are-static-class-members-pinned) –

+0

@ORMapper:CLI標準,我想,雖然我' m總是對實現細節感到好奇:-) – Cameron

回答

1

標準沒有提到這一點,據我所知 - 這並不奇怪,因爲它絕對是一個你不應該關心託管運行時的實現細節。

由於您希望在非託管互操作中重複使用此地址,因此我可以讓您放心 - 您不能真正訪問不安全代碼中這些靜態字段的地址。我不知道爲什麼(可能作爲一些保護措施),但似乎是這樣。

當然,noöne會阻止您製作自己的幫助器類型,該類型爲所需的任何內容分配一個非託管內存,並將這些字段替換爲讀取非託管內存的屬性 - 您甚至不必關心GC,因爲無論如何,靜態字段只會與域(通常是進程)一起死亡。

+0

感謝您的回答。這就說得通了。我想象常量是一樣的嗎? – Cameron

+0

@Cameron常量通常是內聯的,所以難度更明顯:)無論如何,它並不重要,因爲常量是基元 - 引用通常比複製要昂貴(大約相同數量的數據,但避免了間接一個參考)。 – Luaan

+0

啊,但也有恆定的字符串,它們是引用類型。但是,我明白你的觀點。內聯使得整個事情都沒有意義,我忘了發生了什麼。 – Cameron