これは私がよく使うテクニックです。これは、objectsプロパティが消費コード内で実際に使用されていない限り、List <>オブジェクトをインスタンス化しないため、メモリリソースの節約にも役立ちます。これは「遅延読み込み」手法を使用します。
また、リストした「遅延読み込み」手法はスレッドセーフではありません。プロパティへの複数の呼び出しが同時に発生した場合、プロパティを新しいList <>オブジェクトに設定する複数の呼び出しが発生し、その結果、既存のList値が新しい空のList<>オブジェクトで上書きされる可能性があります。Getアクセサーをスレッドセーフにするには、次のようにLockステートメントを使用する必要があります。
private IList<BCSFilter> _BCSFilters;
// Create out "key" to use for locking
private object _BCSFiltersLOCK = new Object();
/// <summary>
/// Gets or sets the BCS filters.
/// </summary>
/// <value>The BCS filters.</value>
public IList<BCSFilter> BCSFilters
{
get
{
if (_BCSFilters == null)
{
// Lock the object before modifying it, so other
// simultaneous calls don't step on each other
lock(_BCSFiltersLOCK)
{
if (_BCSFilters == null)
}
_BCSFilters = new List<BCSFilter>();
}
}
}
return _BCSFilters;
}
set
{
_BCSFilters = value;
}
}
ただし、List <>オブジェクトを常にインスタンス化する必要がある場合は、オブジェクトコンストラクター内で作成し、代わりに自動プロパティを使用する方が少し簡単です。次のように:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
さらに、「set」アクセサーをパブリックのままにすると、消費コードはプロパティをNullに設定できるようになり、他の消費コードを壊す可能性があります。したがって、消費するコードがプロパティ値をNullに設定できないようにするための優れた手法は、設定されたアクセサーをプライベートに設定することです。このような:
public IList<BCSFilter> BCSFilters { get; private set; }
関連する手法は、代わりにプロパティからIEnumerable<>オブジェクトを返すことです。これにより、いつでもオブジェクト内でList <>タイプを置き換えることができ、消費するコードは影響を受けません。IEnumerable <>を返すには、IEnumerable <>インターフェイスを実装しているため、プレーンなList<>オブジェクトを直接返すことができます。次のように:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}