2017-05-01 13 views
4

このクラスの設定に使用します。C#初期設定の構文

public class X 
{ 
    public Y YInstance; 

    public X() 
    { 
     YInstance = new Y(); 
    } 
} 

public class Y 
{ 
    public long Z; 
} 

私はこのコードを持っていました。

var x = new X(); 
x.YInstance.Z = 1; 

Resharperは私のコードをこれに変換したオブジェクトイニシャライザを使用するヒントを持っていました。

var x = new X { YInstance = { Z = 1 } }; 

私は、プロパティを記入するブラケットを使用して、通常のオブジェクトの初期化に精通しているが、私はこれが何をしているかわかりません。 ILを見ると、最初の推測だった新しい匿名クラスでYInstanceを設定しているようには見えません。それはResharperが示唆している奇妙な前と同じ機能性ではありません。

私は、検索するための言語機能のキーワードや簡単な説明を探しています。

+0

"IDE0017 C#オブジェクトの初期化を簡略化することができます" – Reddy

+0

R#はすでに "object initializer"を検索するキーフレーズを与えています。 – stannius

+0

オブジェクトイニシャライザのmsdnは、新しいオブジェクトを作成せずにフォームを使用することについて言及していないことを指摘したいと思います。 https://msdn.microsoft.com/en-us/library/bb384062.aspx –

答えて

8

構文は任意ですが、厳密に言えば、私の考えでは、YInstance = { Z = 1 }にはnewというキーワードがないので、コンストラクタは呼び出されません。しかし、構文のイニシャライザ部分が存在するので、単にイニシャライザを(うまくいけば!)既存のYInstanceのプロパティに適用しているだけです。あなたのケースでは、あなたがXコンストラクタで作成したため、Yインスタンスが存在します。 Here's what would happen if you didn't。代わりに、「この事にYInstanceを設定する」の

は、それが「それらものにプロパティにYInstanceのを設定してください」です。

= { ... }この場合、プロパティの既存の値に初期化子を適用することを意味します。

プロパティ名とイニシャライザブレースの間にある=で、理想的には直感的には見えないかもしれませんが、それはそれがどのような構文であっても、すぐにそれを認識することを学びます。あなたは既に作成されているコレクションの項目を初期化するために同じことを行うことができます...

public class C { 
    public List<int> Items { get; } = new List<int>(); 
} 

C#のチームメンバーの

// This can't be assigning to Items, because it's read-only 
var c = new C { Items = { 0, 1, 2 } }; 

一つ

(あなたが彼の名前を言及するならば、彼が表示されます。 ) once kindly took the time to comment on an answer to a question about the list initializer syntax。彼らは多くの周りにそれを蹴ったが、これは彼らが思いついた最善の選択肢だった。成熟した言語に構文を追加することについては、多くの考慮事項があります。彼らはプログラマーにできるだけ明確にすることで多くの睡眠を失うが、同時にコンパイラーには明白でなければならず、既存のコードを壊すことはできない。 "構文は任意である" C#チームが任意の決定を下すこと

なぜ私はResharperが中括弧の海に向かってあなたの腕に向かって反対するだろうと言うことはできません。私はあなたの元のバージョンが好きです。

+0

ありがとうございました!私の主な問題は、すでに作成されたものに{...}適用することができなかったことでした。私は最初の作成に使用しただけです。 –

+1

@JakePadgettそれは変です、あなたはそれほど多くは見えませんが[明らかにそれはしばらくの間ありました](http://stackoverflow.com/a/32897735/424129)。プロパティ|ビルド| Advanced ...、C#3.0では動作しますが、ISO-1やISO-2では動作しません。だから、 'var'と同じくらい長い間されています。しかし、私はそれに関する文書を見つけることができません。 –

関連する問題