2016-12-23 36 views
4

我有一個class X與被聲明爲靜態成員大尺寸領域的成員y(在內存方面),我注意到,每個I實例的X對象時,本場拿到加載或重新加載到內存中。 y的底層結構是dictionary<string,int>,它擁有大約5000個kvs。有沒有一種方法可以將y聲明爲單獨的顯式字典,並在應用程序生命週期內保持活動狀態?保持一個對象活在C#

注意:在運行時可以放置X的對象,所以更準確的問題是:如果字典被聲明爲類的靜態成員,如果該類的對象有垃圾,靜態成員是否會保留在內存中收集或明確銷燬?

+3

靜態成員在應用程序的整個生命週期中保持活躍狀態​​。你是怎麼注意到該字段被重新加載的? –

+2

你是怎麼知道的 - 「每次我實例化一個X的對象時,這個字段都會被加載或者重載到內存中?靜態字段在其生命週期中僅被初始化或加載一次。 – RBT

+1

「我注意到,每次我實例化一個X的對象時,這個字段都會被加載或重新加載到內存中。」 - 你能告訴我們你的構造函數嗎?我很好奇,如果你有'y =新詞典(){etc ..}' – Quantic

回答

6

您正在重新實例化導致字典變量重新載入/重新生成的類的實例構造函數中的靜態字段。初始化它在類中聲明

static Dictionary<string, int> y = new Dictionary<string, int>() {kvs}; 

OR

在靜態構造函數

static Dictionary<string, int> y; 
static myClass() 
{ 
    y = new Dictionary<string, int>() {kvs}; 
} 
一類或靜態字段

靜態構造函數初始化只運行一次的靜態字段或者在線在他們的生活中。

+2

我只有一個小問題,如果字典被聲明爲類的靜態成員,如果該類的對象被垃圾回收或顯式銷燬,靜態成員是否會保留在內存中? – Alrehamy

+1

是的。類的靜態成員由一個稱爲「類型實例」的特殊類實例保存。僅當您卸載應用程序域時纔會收集「類型實例」。 – RBT

+2

是的,它會留在內存中,因爲靜態成員是類型定義的一部分,它們不是實例(對象)成員 –

相關問題