2016-05-02 10 views
1

私はいつもNewを使用し、私は通常、(Tの)リストを使用read-only property as list(of T)vb.netクラス読み取り専用のプロパティは

Public ReadOnly Property oList As List(Of String) 
Get 
    Return ... 
End Get 

の使用例を探しています私の変数型の前のコンストラクタPublic Property oList as New list(of T)

しかし、今私はVisual Studioからエラーメッセージが表示されます。 これはどのように機能しますか?

は私が..

+0

クラスコンストラクタでプライベートバッキングフィールドvarを初期化します。また、返す前にNothingをチェックすることもできます。 – Plutonix

答えて

4

前に読み取り専用プロパティを使用したことがない簡単な例です:

Private myList As New List(Of String) 

Public ReadOnly Property List As List(Of String) 
    Get 
     Return myList 
    End Get 
End Property 

または、Visual Studioの2015年にサポート自動初期化ReadOnlyプロパティ(すなわち、VB14を使用し、上記):

Public ReadOnly Property List As List(Of String) = New List(Of String) 

今の消費者は追加したり、リストから削除することができます。

myObject.List.Add(...) 
myObject.List.Remove(...) 

が、彼らは、全体としてのリストを置き換えることはできません。

  • ListNothingことはありませんが常に確保されている不変:

    myObject.List = someOtherList ' compile error 
    myObject.List = Nothing  ' compile error 
    

    これは、いくつかの利点がありました。

  • のような直感的なものを行うことはできませんあなたのクラスの消費者は、2つのオブジェクトのリストを「結ぶ」

    myObject1.List = myObject2.List ' Both objects reference the same list now 
    
  • 側の注意点として

、私はを公開することをお勧めします代わりに、具体的なクラスのこのような状況でインターフェースIList):

Public ReadOnly Property List As IList(Of String) = New List(Of String) 

これは、上記のすべての機能を提供します。また、契約の内容を変更することなく、つまりライブラリのコンシューマを再コンパイルすることなく、リストの具体的なタイプを後でたとえばMyFancyListWithAdditionalMethodsに変更することができます。

関連する問題