2017-08-17 5 views
0

私は以下のサンプルコードを単純化して質問を示しました。単一のPageオブジェクトはN Elementオブジェクトを持つことができ、理論的には何百ものオブジェクトが存在する可能性があります。できるだけ保守可能なコードを作るために、それぞれElementを宣言して同じ行に初期化する方法があるかどうかを尋ねています。C#6を使用して繰り返し宣言と初期化を短縮するにはどうすればよいですか?

私が作った最初の試みは、Bだったが、私は一つの場所にElementを宣言し、クラスの別の部分には、コンストラクタでそれを初期化しなければならなかったので、これは退屈/迷惑でした。

次の試みは、私が現在使っている方法はAです。もう少しコードがありますそれぞれElementですが、それはすべて1つの場所です。もう一つの利点は(私の状況では)オブジェクトは実際には必要になるまで作成されないということです。下側(この方法の私の意見では)は、20 + Elementのプロパティがあるとき、ファイルは本当に長く、それはすべてコピー/ペーストだということです。

私は宣言し、各Element 1のラインを初期化する方法を探して(そしてそれはシングルトンボーナスだろうようにすることができた場合)しています。 Cは私が大丈夫であるが、実際には明白な理由で実際にはコンパイルされない例です。 Bを短縮する方法がありますか、新しいC#6機能の一部を使用して、より短く明確な方法で書き直す方法はありますか?


public class Authorization 
{ 
} 

public class Element 
{ 
    private Authorization _authorization; 

    public Element(Authorization authorization) 
    { 
     _authorization = authorization; 
    } 
} 

public class Page 
{ 
    private Authorization _authorization; 

    public Page(Authorization authorization) 
    { 
     _authorization = authorization; 

     ElementTwo = new Element(_authorization); 
    } 

    // A 
    private Element _elementOne; 
    public Element ElementOne => _elementOne ?? (_elementOne = new Element(_authorization)); 

    // B 
    public Element ElementTwo { get; private set; } 

    // C - Ideal 
    // A field initializer cannot reference the non-static field, method, or property 'Page.Authorization' 
    // Cannot access non-static field Authorization in static context 
    public Element ElementThree { get; } = new Element(_authorization); 
} 
+0

あなたの投稿を再読み込みしたいと思うかもしれません。明確にするために編集できますか? – maccettura

+0

私はBとCを組み合わせるときにどこに問題があるかわかりませんが、同じ行にプライベートsetterとinitialiseプロパティを持つことができます: 'public Element ElementThree {get;プライベートセット; } = new Element(Authorization); 'コードの重複があるので別の問題があるようですが、提供されたコードから明らかではないので、私たちはあなたを助けません。 – CrudaLilium

+3

@CrudaLiliumプライベートセッターは必要ありません。 OPのコードがコンパイルされないのとまったく同じ理由で、 "解決策"がコンパイルに失敗します。 – Servy

答えて

2

あなたは辞書やそのための方法を使用することができますか? [CallerMemberName]が機能しない場合、私はこのコードをコンパイルしませんでした。

public class Page { 

    private readonly Authorization _auth; 
    private readonly IDictionary<string, Element> _elements = new Dictionary<string, Element>(); 

    public Element ElementOne => GetOrCreateElement(); 
    public Element ElementTwo => GetOrCreateElement(); 
    public Element ElementThree => GetOrCreateElement(); 

    public Page(Authorization auth) { 
    _auth = auth; 
    } 

    private Element GetOrCreateElement([CallerMemberName] string name = null) { 
    if(_elements.TryGetValue(name, out var returnElement)) 
     return returnElement; 
    var element = new Element(_auth); 
    _elements.Add(name, element); 
    return element; 
    } 

} 
関連する問題