コンストラクター変数はプライベートフィールドまたはプロパティに直接渡す必要がありますか?

StackOverflow https://stackoverflow.com/questions/131517

  •  02-07-2019
  •  | 
  •  

質問

これは .NET ですが、プリンシパルはすべての OOP 言語に適用されるはずです。簡単にするために、.NET を例に挙げます。

R# は通常、コンストラクターを作成し、受信した変数をプライベート フィールドに渡します。私の場合、それをプロパティに渡す傾向があります。

違いとそのベストプラクティスについて何か意見はありますか?

役に立ちましたか?

解決

仮想/オーバーライドされていない限り、プロパティを使用しても問題ありません。プロパティは本質的にはメソッドであり、適切な型がまだ構築されていない可能性があるため、コンストラクター内から仮想メソッドを呼び出さないでください。Microsoft は独自のリストを作成しました ガイドラインのセット, を一番下までスクロールすると、関連するガイダンスと問題を説明するコード スニペットが表示されます (メソッドを使用して説明していますが、前述したように、.NET プロパティは本質的に特別なメソッドです)。

他のヒント

プロパティ セッターを介してパラメーターを渡すと、検証コードを 1 か所のみに保持できます。

正確な条件は実際の実装によって決まりますが、プライベート フィールドに直接送信するのではなく、プロパティに送信することをお勧めします。たとえば、プロパティの使用時にイベントが発生するが、コンストラクター中にそれらのイベントを発生させたくない場合があります。あるいは、他の理由でプロパティ ロジックを回避したい場合もあります。

プロパティ セッターの使用には注意してください。セッターに予期しない副作用を引き起こす可能性のあるコードが含まれている可能性があります。

コンストラクター内でフィールドを操作します。フィールドは実際にはオブジェクトの固有の状態を表しており、コンストラクターの仕事はこの内部状態を初期化することです。プロパティはカプセル化の目的でのみ存在し、オブジェクトの状態へのパブリック インターフェイスの一部です。

オブジェクトの内部状態を設定する前に、コンストラクターの引数またはプロパティの入力値に適用する変換ロジックは、大きく異なる場合があります。とにかく、その場合は、プロパティ セッターでコンストラクターを直接チェーンするのではなく、プロパティ セッターとコンストラクターから呼び出される明示的な変換メソッドを使用していました。

ロジックがまったくない場合、コンストラクター内でプロパティ セッターを使用する理由がわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top