Jeffrey Richterは、優れた著書であるCLR Via C#で、プロパティは好きではないので、使用しないことを推奨しています。彼は何らかの理由を挙げましたが、私にはよくわかりません。プロパティを使用する理由または使用しない理由を誰かに説明できますか?自動プロパティを備えたC#3.0では、これは変更されますか?
参考として、ジェフリー・リヒターの意見を追加しました。
•プロパティは読み取り専用または書き込み専用です。フィールドアクセスは常に読み取りと書き込みが可能です。プロパティを定義する場合は、getとsetの両方のアクセサーメソッドを提供するのが最善です。
•プロパティメソッドは例外をスローする場合があります。フィールドアクセスは例外をスローしません。
•プロパティをoutまたはrefパラメーターとしてメソッドに渡すことはできません。フィールドはできます。たとえば、次のコードはコンパイルされません。
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
•プロパティメソッドの実行には時間がかかる場合があります。フィールドへのアクセスは常に即座に完了します。プロパティを使用する一般的な理由は、スレッドの同期を実行することです。これにより、スレッドが永久に停止する可能性があるため、スレッドの同期が必要な場合はプロパティを使用しないでください。そのような状況では、方法が推奨されます。また、クラスにリモートアクセスできる場合(たとえば、クラスがSystem.MashalByRefObjectから派生している場合)、プロパティメソッドの呼び出しは非常に遅くなるため、プロパティよりもメソッドの方が適しています。私の意見では、MarshalByRefObjectから派生したクラスではプロパティを使用しないでください。
•連続して複数回呼び出された場合、プロパティメソッドは毎回異なる値を返す場合があります。フィールドは毎回同じ値を返します。System.DateTimeクラスには、現在の日付と時刻を返す読み取り専用のNowプロパティがあります。このプロパティをクエリするたびに、異なる値が返されます。これは誤りであり、Microsoftは、Nowをプロパティではなくメソッドにすることでクラスを修正できることを願っています。
•プロパティメソッドは、観察可能な副作用を引き起こす可能性があります。フィールドアクセスは行いません。言い換えると、型のユーザーは、型で定義されたさまざまなプロパティを、型の異なる動作に気付かずに、選択した順序で設定できる必要があります。
•プロパティメソッドは追加のメモリを必要とする場合や、実際にはオブジェクトの状態の一部ではない何かへの参照を返す場合があるため、返されたオブジェクトを変更しても元のオブジェクトには影響しません。フィールドをクエリすると、常に元のオブジェクトの状態の一部であることが保証されているオブジェクトへの参照が返されます。コピーを返すプロパティでの作業は、開発者にとって非常に混乱する可能性があり、この特性は文書化されていないことがよくあります。