2013-04-10 36 views
0

我有一個5-6字段的類,應該在構造函數運行後初始化一次。在C#中,遲到初始化實例字段最簡單的方法是什麼?

public OriginalFileProcessor(IConfigManager configManager) 
     { 
      this._configManager = configManager; 
      this._field1 = this._configManager.GetAppSetting<int>ConfigKeys.Key1); 
      this._field2 = this._configManager.GetAppSetting<int>ConfigKeys.Key2); 
      this._field3 = this._configManager.GetAppSetting<int>ConfigKeys.Key3); 
      this._field4 = this._configManager.GetAppSetting<int>ConfigKeys.Key4); 
      this._field5 = this._configManager.GetAppSetting<int>ConfigKeys.Key5); 
     } 

但我不喜歡在構造函數中只是簡單的任務除了寫邏輯。

從那時起,我無法使用那裏的_configManager例如我不能使用內聯初始化FIELD1例如:

private int readonly _field1 = this._configManager.GetAppSetting<int>ConfigKeys.Key1); 

如果我使用一個只讀屬性,然後我不得不添加額外的代碼一樣這樣的:

private int? _field1; 
     public int Property1 
     { 
      get 
      { 
       if (!this._field1.HasValue) 
       { 
        this.__field1 = this._configManager.GetAppSetting<int>(Key1);  
       } 
       return this._field1.Value; 
      } 
     } 

是否有實例字段的初始化後期任何簡單的方法?

回答

5

Lazy<T>是一個很好的選擇建議。

我通常用的是下面的...

提供您的_field*nullable

在你的財產,你可以做...

return this.__field1 ?? (this.__field1 = this._configManager.GetAppSetting<int>(Key1)); 

編輯:

給出意見討論 - 爲什麼不使用non static approach而不是Lazy<T>,例如

​​

編輯2:

和一個小測試,以澄清懶惰行爲:

public class DoLazy 
{ 
    Lazy<int?> _field; 
    public DoLazy() 
    { 
     // 'lazy' gets initialized - but `YourFieldInit` is not called yet. 
     _field = new Lazy<int?>(() => YourFieldInit("")); 
    } 
    int Property 
    { 
     get 
     { 
      // `YourFieldInit` is called here, first time. 
      return _field.Value ?? 0; 
     } 
    } 
    int? YourFieldInit(string test) 
    { // breakpoint here 
     return -1; 
    } 
    public static void Test() 
    { 
     var lazy = new DoLazy(); 
     int val1 = lazy.Property; 
     var val = lazy.Property; 
    } 
} 

把一個斷點YourFieldInit內 - 時看到它的實際調用。
致電DoLazy.Test()從您的主要。

+0

+1,好方法 – 2013-04-10 10:30:55

+0

@CuongLe爲什麼要刪除你的答案? – NSGaga 2013-04-10 10:31:28

+1

這是不正確的 – 2013-04-10 10:32:01

相關問題