クラスの外部からメンバーにアクセスする場合、カプセル化は明らかに有用で不可欠ですが、クラス変数を内部で参照する場合は、プライベートメンバーを呼び出すか、ゲッターを使用する方がよいでしょうか。ゲッターが単に変数を返す場合、パフォーマンスの違いはありますか?
5 に答える
パフォーマンスに大きな違いはないはずです。プロパティの使用に固執する理由は、それがカプセル化の全体的なポイントだからです。これらのプライベートメンバーのすべてのアクセスの一貫性と制御を維持します。したがって、プロパティゲッター/セッターを変更したい場合は、「プライベートメンバーに直接アクセスすることにした場所の他の場所で同じ機能を複製する必要がありますか?」と考える必要はありません。
ゲッターが遅延初期化または他の処理を実行しない限り、フィールドに直接アクセスするか、ゲッターを使用しても、通常は大きな違いはありません。したがって、ゲッターが何をするかによって異なりますが、私の経験則では、特定の場合を除いて、常にゲッターを使用します。
フィールドに値を割り当てるには、セッターに検証コードを含めたり、イベントを発生させたりすることがよくあることを忘れないでください。その場合は、常にセッターを使用する必要があります。
利点は、GetまたはSetで実行する検証があった場合にあります。これは1つの場所にあり、常に呼び出されます。
私が知る限り(Stack Overflowで尋ねられた他の質問から)、Getterが単純に値を返す場合、生成されたコードは変数に直接アクセスする場合と同じです。
約 98% の場合、パフォーマンスの違いは無視できます。
ゲッターまたはセッターがプライベート メンバーを取得または設定するだけであっても、常にプロパティを使用する必要があります。これにより、アプリケーションの進化に合わせて変更を加えることができます。そうすることで、コードを壊すことなく、プロパティ内にいくつかの制限やその他のカプセル化を導入することができます。そうしないと、X の理由でプロパティを記述することにした場合、プライベート メンバーの代わりにプロパティを取得または設定するために、すべてのコードをリファクタリングする必要があることに気付くでしょう。
私は遅延初期化に内部プロパティを使用するのが好きです。プロパティでは、オブジェクトが初期化されていることを確認します。これにより、まだ初期化されていないクラス レベルの変数を使用していないことが保証されます。
TestClass1 _class1
internal TestClass1
{
get
{
if (_class == null)
_class = new TestClass1()
return _class1
}
}