簡體   English   中英

.Net在哪里存儲泛型類型的靜態字段的值?

[英]Where does .Net store the values of the static fields of generic types?

以下代碼允許我為每個類型T存儲一個值:

public static class MyDict<T> {
    public static T Value;
}

我可以存儲盡可能多的值,並且編譯器之前不知道我要使用的類型。 這些靜態字段值的存儲方式和位置在哪里?

更新 :顯然它存儲在內存中,但我想知道這個內存。 是堆嗎? 它是一些特殊的CLR內存嗎? 怎么稱呼? 還有什么方式存儲?

更新2 :JITter為MyDict<T>所有引用類型參數生成單個實現MyDict<__Canon> MyDict<T> 然而,這些值是分開存儲的。 我猜每個類型參數仍然有一些per-type-argument結構,雖然thw vtable鏈接到JITted MyDict<__Canon> ,但字段是分開的。 我對嗎?

這些靜態字段值的存儲方式和位置在哪里?

它們存儲在CLR選擇的位置的存儲器中。

顯然它存儲在內存中,但我想知道這個內存。

我出於好奇而假設。 如果你根據這個問題的答案做出編程決定那么你做錯了。

是堆嗎?

好吧,它不是堆棧或寄存器,這是肯定的。

它是一些特殊的CLR內存嗎?

是的。

這叫什么?

高頻堆。

還有什么方式存儲?

虛函數表。 接口映射結構。 方法說明。 CLR認為可以經常訪問的任何其他內容,由CLR自行決定。 我們在此深入了解實施細節。

JITter為MyDict<T>所有引用類型參數生成單個實現MyDict<__Canon> MyDict<T>

正確,雖然這是一個實現細節。

然而,這些值是分開存儲的。

“值”是指“每個構造類型的靜態字段的值”。 是。

我想每個類型參數仍然有一些per-type-argument結構

是的,數據必須到達某個地方!

vtable鏈接到JITted MyDict<__Canon> ,字段是分開的。

我不明白這句話是什么意思,所以我無法證實或否認其正確性。

我也想知道是否有辦法像這樣擁有每個對象的商店。 即不是泛型類型+ T,而是對象+ T.

為了澄清,您的問題是: 有一些存儲機制將泛型類型C<T>和給定構造C<Foo>與給定的C<Foo>靜態字段相關聯。 我們可以將其視為查找,其中“key”是元組( C<T>Foofield ),值是字段的值。 是否有類似的存儲機制,其中鍵是( C<T>some arbitrary objectfield )?

不,如果您需要,請自行構建。

MyDict<T>不是完全定義的類型。 每個完全定義的MyDict<T>類型都有自己唯一的Value實例(例如MyDict<string>MyDict<object>MyDict<int>可以具有唯一的Value )。

此外,這並不特殊,因為Value的類型是T ,即使Value的類型是DateTime ,每個完全定義的類型仍然有自己的靜態值實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM