Microsoft によると、すべての.Net 属性を封印することをお勧めします。
.NET Framework クラス ライブラリには、カスタム属性を取得するためのメソッドが用意されています。デフォルトでは、これらのメソッドは属性継承階層を検索します。たとえばSystem.Attribute.GetCustomAttribute
、指定された属性タイプ、または指定された属性タイプを拡張する任意の属性タイプを検索します。属性を封印すると、継承階層を介した検索が不要になり、パフォーマンスが向上します。【私のこだわり】
.Net[Serializable]
リフレクションが属性をチェックする方が速いため、封印されています。コストは、継承および拡張できないことですSerializableAttribute
。
必要に応じて、独自の封印されていない属性を作成できます (ただし、コード分析の警告が表示されます)。
これは、属性が適用されるクラスの継承で属性がどのように使用されるかを少し混乱させます。例を使用するのがおそらく最善です:
[Serializable]
public class A
{
public int SimpleSerialisableProperty { get; set;}
}
public class B : A
{
public C ComplexReferenceProperty { get; set; }
}
[Serializable]
public class D : A
{
public bool AnotherSerialisableProperty { get; set;}
}
あなたは理由SerializableAttribute.Inherited = false
を尋ねましたが、これが理由です:
クラスA
は としてマークされて[Serializable]
おり、そうです。
ただし、クラスはシリアル化できないプロパティでそれをB
継承および拡張します。A
.Net がシリアル化しようとB
すると、エラーが発生します。
これInherited = false
は.Netに、それを継承するすべてのクラスがシリアライズ可能になるわけではないという理由だけでA
マークされていることを伝えます。[Serializable]
クラスはD
継承A
され、シリアライズ可能になったため、独自の[Serializable]
属性を取得します。
最後に、デザイン属性に関しては、動作を拡張する優れた方法です(プロパティ グリッドの優れた UI エディターなど)。しかし、彼らはそれを強制するのがひどいです。顧客に特定の方法でエンティティ クラスを実装してもらう必要がある場合は、abstract
基本クラスまたは を使用するinterface
方がはるかに優れています。[Serializable]
それを属性にすると、基本的に、それがどちらの方法でも処理できるオプションであることを彼らに知らせることになります。