ProgrammingVB.NET 開発者、ビジネスアプリケーション開発者

プロパティ(Properties)を完全なGet/Setブロックで定義する方法と、自動実装プロパティ(Auto-Implemented Properties)の違いを説明し、Set内でのValueの使用に関する隠れたニュアンスについて説明してください。

Hintsage AIアシスタントで面接を突破

回答。

Visual Basicでは、プロパティ(Property)は2つの方法で宣言できます:

  • 完全なプロパティ(独自のGet/Setブロック): データへのアクセスを制御し、値の読み取り/書き込み時に追加の検証や処理を実行できます。
  • 自動プロパティ(auto-implemented): Get/Setが明示的に書かれず、プライベートフィールドが自動的に作成される省略形です:
' 自動プロパティ 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)が厳格に要求されます。


歴史

大規模プロジェクトでVB6からVB.NETへの自動コード移行時に、SetにByValを追加したところ、コンパイラが奇妙なエラーを出力し、それを特定するのに時間がかかりました。リントツールが明確な理由を示さなかったためです。

歴史

大規模データセットを処理するプロジェクトでは、自動プロパティを使ってデータを格納していましたが、その後、プロパティが変更されているかを追跡して自動的に変更を記録する必要が生じました。自動プロパティを完全なプロパティに変更する必要があり、結局、Set内に追加のロジックが必要であることを最初に考慮していなかったため、多くの時間をリファクタリングに失いました。

歴史

自動プロパティを通じて参照型オブジェクトをコピーする際に、Get/Setを使用したディープコピーの実装を忘れました。その結果、同じオブジェクトへの参照が重複し、一方のインスタンスの変更がもう一方にも影響を与えることになりました。