2016-08-30 5 views
2

私は開発中のアプリケーションを経由してきましたが、それは不変性を重視しています。私はちょうどゲッター専用の自動プロパティがC#6.0にあることを発見したので、それらを使用するためにリファクタリングしています。私は可能な疑問符を打ちました。これは、private IList<T>オブジェクトを公開プロパティを介してReadOnlyCollection<T>として公開しているため、元のList<T>オブジェクトにキャストされる可能性を避けるためです。この不変プロパティをautoプロパティに変換できますか?

private IList<string> tags = new List<string>();

public IEnumerable<string> Tags => new ReadOnlyCollection<string>(this.tags);

カスタマイズされたゲッターのこのタイプの自動プロパティを使用する方法はありますか?

+1

ゲッターにコードがあるため、自動プロパティにすることはできません。問題は何が間違っているのですか?なぜあなたはオートプロパティが必要ですか? – Sinatr

+0

これは、自動プロパティではありません。一般的なコードスタイルに合わせるかどうかは不思議です。 – James

+0

* "一般的なコードスタイル" * - 自動プロパティのみまたは完全なプロパティのみを使用するものはありません。 Btw、getter only property * immutable *を呼び出すと、毎回何かの**新しいインスタンス**が公開されると間違っていると感じます。コンストラクタでそのプロパティを初期化すると、実際には(getterのみで)自動プロパティを使用できます。 – Sinatr

答えて

6

残念ながら、自動プロパティは、にゲッターやセッターをカスタマイズしていないプロパティのショートカットです。サイドノートとして


:Sinatrが正しくコメントで述べているように、あなたはすべてのプロパティの呼び出しにReadOnlyCollectionの新しいインスタンスを作成しています。これは不動産のためのものではありません。代わりに、同じインスタンスを毎回返す考えてみましょう: ReadOnlyCollectionは、基になるコレクションに加えられた変更を反映するため

private IList<string> tags = new List<string>(); 
public IEnumerable<string> Tags { get; } 

public MyClass() 
{ 
    Tags = new ReadOnlyCollection<string>(this.tags); 
} 

これは動作します:

ReadOnlyCollection<T>ジェネリッククラスのインスタンスをされて、常に読み取り専用です。読み取り専用のコレクションは、単にコレクションを変更できないようにするラッパーを持つコレクションです。 したがって、基になるコレクションに変更が加えられた場合、読み取り専用コレクションにはそれらの変更が反映されます。


注:コンストラクタが必要とされる:C#はフィールド初期化子がthe compiler might rearrange the initialization orderので、他のインスタンスのフィールドを参照することはできません。フィールドが表示される順序で初期化されるVB.NETでは、次のように記述できます。

Private tagList As New List(Of String)() 
Public ReadOnly Property Tags As IEnumerable(Of String) = New ReadOnlyCollection(Of String)(tagList) 
+0

あなたはいいえ、しかしあなたの提案された改善は私にはいと言います。 ;)もちろん、それは意味的には同じではありませんが、OPの特定のケースでは、私はこのように 'はい、このように'と言ってもいいと思います。 – Joren

+0

@Joren:改善しても、彼は依然として明示的な "バッキングフィールド" tags = new List (); ' - 明示的な*と暗黙の暗黙のものを持つようになりました。私はこれを強調するために私の答えに2行目を加えました。 – Heinzi

+0

あなたは正しいです、私は質問を誤解していたと思います。 – Joren

関連する問題