2009-07-31 3 views
5

私はクラスを持っていますが、このクラスは空でもかまいません。このクラスはString型のパブリックプロパティのみを持ちます。このクラスが空の状態にある場合は、すべてのプロパティの値がString.Emptyであることを意味します。自分の静的な空またはゼロフィールドを正しく実装する方法

1)public static フィールドを使用すると、Class.Emptyのプロパティを変更できます。

2)私は(パブリック静的プロパティゲッターは、新しい空のオブジェクトを返すべきであることがわかり手動)たびに空にするためのすべてのフィールドを設定しないでください。私は悪い習慣と考えています。

3)別の解決方法は、独自のクラスを実装することです。 IsNullOrEmpty(クラスobj)

4)A 非static public booleanプロパティobj。 IsEmpty

他のクラスここで、このクラスが使用されている場合、このプロパティは決してnullになりません。 他のクラスは、それを適切に初期化する(さらに別のクラスの)メソッドから返されます。

プロパティがnullの唯一のケースは、そのメソッドの外に新しいものがあると、そのメソッドが無効な状態になることです。

答えて

9

1と2が矛盾します。

タイプが不変の場合は、毎回同じインスタンスへの参照を返すことができます。変更可能な場合は、にはがあり、毎回新しいオブジェクトへの参照が返されます。

string.Emptyが問題ない理由は、正確にはstringが不変であるためです。

タイプに変更可能ですか?

EDIT:あなたのコメントに基づいて、プロパティはセッターを全く持たないように思えます。その代わりに、値はコンストラクターに渡され、読み取り専用フィールドに格納されます。

あなたは常に同じ値を返すパブリックフィールドまたはプロパティのいずれかを公開することができますので、その時点であなたのタイプは、不変である、すなわち

private static readonly MyType empty = new MyType("", ""); // Or whatever 
public static MyType Empty { get { return empty; } } 

または

public static readonly MyType Empty = new MyType("", ""); 

あなたは必要ありません。どんなセッターをも持っていないので、どんなプロパティを設定する人も気にする必要はありません。

+0

一度プロパティが設定されると、決して変更しないでください。答えはいいえ、そうですか? –

+0

回答を編集してコメントを反映する... –

+0

これは当てはまりますが、これはコンストラクタを使用してプロパティを最初に設定した方法です。残念ながら、型がXmlSerializerでシリアル化されることには言及していませんでした。私の知る限りでは、すべてのシリアル化されたプロパティのパブリックget/setterが必要です。しかし、IXmlSerializable(これは変更しないことを予定している小さなクラスです)を実装すると、パブリックセッターは必要ありません。正しい?このクラスを変更する場合は、フィールドを変更/追加するだけでなく、IXmlSerializable実装の文字列も変更する必要があります。 –

関連する問題