2017-03-20 11 views
0

これに当てはまる用語はわからないので、これに関する既存のコメントを検索するかどうかはわかりません。{get;}を使用したC#式ボディ

私は最近に類似表現本体と時間のトンを無駄:私のような値を設定しようと

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 


SearchSomeModel.Property = 12345。

すべてが好きだったように動作しました。しかし、実際の価値は変わらなかった。代わりに{get;}をそのまま挿入したとき:

public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...}; 

正常に機能しました。

面白いことに、これがgetで(通常のGETのようにして開始した場合、{返す..}ということで、その後のReSharperは(?)最初のバージョンに変換するために提供しています。

とにかく、私は理解したいです2つの間の違い(いいえ、CLRレベルではありません)ではなく、ただそれに適切な言葉でそれぞれを参照する方法を知っています。b)なぜ作品がうまくいくのですか?

ありがとうございます!

+1

簡易[TryRoslyn(https://tryroslyn.azurewebsites.net/#b:master/f:r/K4Zwlgdg5gBAygTxAFwKYFsDcBYAUAB2ACMAbMAYxnJIEMQQYBhGAbzxg5kNIpgHsiAK1TlkMAJIBGGAF4AfDAioA7vyEjkACgCUOXJxjtO3MpQHDREgEysYUVMkwwAvrMUq1FrbrzOgA===)... – xanatos

+0

もし私が間違っていないのであれば、式の本文は常に値を評価します(つまり、SearchSomeModelから値を読み込むたびに書き込んだコンストラクタ呼び出しを呼び出します).2番目の例では、記憶され、変更することができる。 – MetaColon

+3

あなたの質問の正確なタイトルを検索すると、あなたの質問に対する答えを説明する(たくさんの)ページが表示されるので、この問題の適切な検索語を明確にあなたは知りました。 – Servy

答えて

4

コードの最初の行 -

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 

はそれがShowSomeViewModelのあなたがgetにそれをしようとするたびに新しいインスタンスを作成することを意味します。
それが相当である。一方

public SomeListViewModel SearchSomeModel { 
    get {return new ShowSomeViewModel{...};} 
} 

public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...}; 

は、デフォルト値を設定していることを意味します。

+0

ありがとうございました!これはあなたがそれに言及した今、かなり明白です。どちらか一方、あるいは両方の異なる表現体系の用語がありますか? – JustMeToo

+1

これは重要な違いです。厳しいルールではありませんが、オブジェクトに変更を加えずに「取得」を2度目に呼び出すと、同じ値が得られることが期待されます。それは「財産のもの」(別名「ミューテータ」または「アクセッサ」)です。 –

+0

@JustMeTooあなたが言及した最初のものは式の本体のプロパティです、そして、私が信じる2番目のものは、初期化子を使ってゲッターのみの自動プロパティーと呼ぶことができます - それはかなり長期ですね。 –

1

コード

public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...}; 

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 

public SomeListViewModel SearchSomeModel 
{ 
    get 
    { 
     return new ShowSomeViewModel{...}; 
    } 
} 
のequivlantに翻訳さ

private SomeListViewModel _searchSomeModel = new ShowSomeViewModel{...}; 
public SomeListViewModel SearchSomeModel 
{ 
    get 
    { 
     return _searchSomeModel; 
    } 
} 

コードの等価物に変換されます

ShowSomeViewModelの新しいインスタンスを取得しているプロパティを呼び出すたびに2番目のフォームを使用する場合、最初のフォームを使用すると、同じ呼び出しが返されます。

2番目のフォームが機能しなかったのは、古いインスタンスの値を更新する場所でしたが、2回目にプロパティを呼び出して値を確認したときに、ビューモデルを持たないビューモデルの新しいインスタンス変更。差を示す

関連する問題