私は以下のサンプルコードを単純化して質問を示しました。単一の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);
}
あなたの投稿を再読み込みしたいと思うかもしれません。明確にするために編集できますか? – maccettura
私はBとCを組み合わせるときにどこに問題があるかわかりませんが、同じ行にプライベートsetterとinitialiseプロパティを持つことができます: 'public Element ElementThree {get;プライベートセット; } = new Element(Authorization); 'コードの重複があるので別の問題があるようですが、提供されたコードから明らかではないので、私たちはあなたを助けません。 – CrudaLilium
@CrudaLiliumプライベートセッターは必要ありません。 OPのコードがコンパイルされないのとまったく同じ理由で、 "解決策"がコンパイルに失敗します。 – Servy