PropertyはVisual Basicにおいて、オブジェクトのデータへのアクセスをカプセル化し、検証、計算、アクセス制御の設定が可能な方法です。プロパティは、値を読み取るためのGetブロックと、値を設定するためのSetブロックを含みます。
Private _age As Integer Public Property Age() As Integer Get Return _age End Get Set(ByVal value As Integer) If value < 0 Or value > 120 Then Throw New ArgumentException("年齢は0から120の間でなければなりません!") End If _age = value End Set End Property
このようなプロパティを使用することで、値のバリデーション、キャッシュ、リアルタイム計算などが実現でき、ユーザーにとっては通常のフィールドのように見えます。
Public Property ItemId As Integer ' 隠れたフィールドを自動的に作成し、ロジックへのアクセスはありません
ニュアンス: 自動プロパティは、明示的なget/setの宣言なしに内部ロジックを拡張することはできません。
質問: Visual Basicで、公開されたsetと非公開のgetのみを持つプロパティを実装することは可能ですか?getとsetのために異なるアクセスレベルをどのように設定しますか?
回答: はい、VB.NETからはgetとsetに対して異なるアクセスレベルを指定できます。
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
この例では、クラスのみがSalaryの値を取得でき、外部オブジェクトはそれを設定するだけです。
物語
開発者はすべてのビジネスオブジェクトのフィールドに自動プロパティを使用しました。後に負の値の入力に対するバリデーションが必要になりましたが、自動プロパティを明示的なものに変更するには多くのコードを手修正する必要があり、エラーやコストが発生しました。
物語
VB6からVB.NETへの移行の過程で、一部のプロパティがpublic修飾子を持つフィールドとして実装され、クラスの内部データへの完全な無許可アクセスを開くことになり、外部オブジェクトによる望ましくない状態の変更を引き起こしました。
物語
複雑なオブジェクトで、プロパティはgetブロック内で追加の計算を含み、ファイル操作も行なっていました。プロパティへのアクセス頻度が高いとアプリケーションのパフォーマンスが急落し、結果をキャッシュするprivateフィールドを使用するべきだったことが判明しました,毎回getで値を計算するのではなく。