2011-06-12 51 views
3

根據這個經常被引用的文章,Unraveling the Mysteries of .NET Configuration,實施的ConfigurationSection的時候/的ConfigurationElement,建議遵循這個模式:ConfigurationPropertyCollection需要是靜態的嗎?

private static ConfigurationPropertyCollection s_properties; 
static ExampleSection() 
{ 
     // Predefine properties here 
     // Add the properties to s_properties 
} 

/// Override the Properties collection and return our custom one. 
protected override ConfigurationPropertyCollection Properties 
{ 
    get { return s_properties; } 
} 

但它並不能解釋爲什麼s_properties領域將需要靜,以及在靜態構造函數中初始化的屬性。
畢竟,它只是通過非靜態Properties重寫屬性訪問...

(我有一組複雜的自定義配置管理,這將大大簡化有東西s_properties場是不是靜態的......)

那麼,是否有一些「隱藏」直接訪問靜態字段?是不是繼續創建並重新創建了對象,這樣對象級別的字段就會丟失,因此效率低下?
或者,將ConfigurationPropertyCollection作爲非靜態存儲和初始化是否完全正常?

+0

你試過了嗎? – svick 2011-06-12 14:54:34

+0

@svick,是的,我試過了,它*似乎*工作正常。但是,我不知道「底層」是怎麼回事,如果這對性能有影響的話。所以也許真正的問題是「爲什麼該文章使用靜態」...... – AviD 2011-06-12 14:58:46

回答

2

但它並不能解釋爲什麼s_properties領域將需要是靜態的,

原因s_properties是靜態的是因爲 開發商只想要一組 - 單一實例 - 配置應用程序的屬性。 [這可能被認爲是典型的。] ConfigurationXXX(例如ConfigurationManager)類是靜態的,因爲您應該只需要每個AppDomain一個。

基本上,樣品中:

private static ConfigurationPropertyCollection s_properties; 
static ExampleSection() 
{ 
     // Predefine properties here 
     // Add the properties to s_properties 
} 

/// Override the Properties collection and return our custom one. 
protected override ConfigurationPropertyCollection Properties 
{ 
    get { return s_properties; } 
} 

筆者假設你只能有s_properties一個實例。

那麼,是否有一些「隱藏」直接訪問靜態字段?

不知道我按照這個問題。

是否不斷創建並重新創建配置***對象,使對象級別的字段丟失,並且效率低下?

[編輯:取決於...我正在考慮ConfigurationManager。但是,說我想擁有我的AppSettingsCollection的本地副本。我會做一個靜態只讀字段聲明。在部分等的情況下,然後我仍然會使用靜態字段inializer,雖然static Dictionary<string, ConfigurationPropertyCollection> Properties。最後,我仍然相信你只會想要一個屬性設置集合的單個實例。]

[原件與其他[編輯]
號公報[靜態]不會連續創建ConfigurationXXX對象,設置,和重新創建。像所有靜態對象一樣,公共靜態初始化/構造函數被執行一次 - 第一次調用該對象。例如,當我呼叫以下內容:

string someValue = ConfigurationManager.AppSettings["SomeKey"]; 

執行靜態ConfigurationManager類構造函數。由於這個類是靜態的,它將在其執行的當前AppDomain的生命週期中生存。

我不會推薦初始化應用程序域屬性,配置屬性或屬性集合爲 實例類。當你的程序開始執行時,你應該依靠一個靜態配置類來包裝和自定義與ConfigurationXXX類,成員和函數的交互。

+0

謝謝你的答案,但它有一個問題:ConfigurationSection和ConfigurationElement類*不*是靜態的,實際上'... ConfigurationPropertyCollection屬性「必須是非靜態的,因爲它正在覆蓋非靜態基本屬性中的相應屬性。所以剩下的答案對我來說也沒有意義。 – AviD 2011-06-12 15:08:20

+0

FTR,我同意通常你應該只有每個配置類的單個實例(除非,當然,你有不止一個......) – AviD 2011-06-12 15:09:25

+0

@AviD是完全合理的,有多個ConfigurationElement實例'(例如一個集合)。它很少可能,但仍可能有多個「ConfigurationSection」實例(在同一結構中設置的「.config」中的兩個組)。 – Richard 2011-06-12 15:19:58