Visual Basicでは、プロパティ(Property)は2つの方法で宣言できます:
' 自動プロパティ Public Property Name As String ' 完全なプロパティ Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("年齢は負の値を取れません") _age = value End Set End Property
Set使用時のニュアンス:
Valueは、代入される値を参照する擬似変数です。Set内でバリデーション、ロギング、イベントのトリガーを実行できます。使用するタイミング:
Set(ByVal value As Integer)と書くことのリスクは何ですか? なぜそのように書くべきではないのでしょうか?
回答:
VB.NETの構文は、SetでパラメータByValを明示的に宣言することを要求せず(またはサポートしません)、単にSet(value As Type)を使用します。Set(ByVal value As Integer)と書くと、コンパイルエラーが発生します。
誤ったコードの例:
'Set(ByVal value As Integer) — コンパイルエラー Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
従来のVB6ではこの構文が許可されていましたが、VB.NETではSet(value As Type)が厳格に要求されます。
歴史
ByValを追加したところ、コンパイラが奇妙なエラーを出力し、それを特定するのに時間がかかりました。リントツールが明確な理由を示さなかったためです。歴史
歴史
自動プロパティを通じて参照型オブジェクトをコピーする際に、Get/Setを使用したディープコピーの実装を忘れました。その結果、同じオブジェクトへの参照が重複し、一方のインスタンスの変更がもう一方にも影響を与えることになりました。