0

コンストラクターの実行後に一度初期化する必要がある 5 ~ 6 個のフィールドを持つクラスがあります。

 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);
        }

しかし、コンストラクターでの単純な代入以外のロジックを書くのは好きではありません。

たとえば、field1 のインライン初期化を使用することはできません。それ以降、そこで _configManager インスタンスを使用することはできません。

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;
            }
        }

インスタンスフィールドの初期化を遅らせるためのより簡単な方法はありますか?

4

1 に答える 1

5

Lazy<T>提案されているように良いオプションです。

私が通常使用するのは次のとおりです...

あなたの提供_field*nullable

あなたの財産でできること...

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

編集:

non static approachコメントの議論が与えられた場合 - over をLazy<T>使用 しないのはなぜですか。

private readonly Lazy<int?> _field;
// init in ctor
_field = new Lazy<int?>(() => YourFieldInit(""));
// use in property
return _field.Value ?? 0;  

編集2:

そして、Lazy 動作を明確にするための小さなテスト:

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()

于 2013-04-10T10:13:46.967 に答える