Dies ist eine Technik, die ich viel selbst verwenden. Dies kann auch dazu beitragen, Speicherressourcen zu sparen, da das Objekt List <> nicht instanziiert wird, es sei denn, die Objekteigenschaft wird tatsächlich innerhalb des konsumierenden Codes verwendet. Dies verwendet eine "Lazy Loading" -Technik.
Auch die "Lazy Loading" -Technik, die Sie aufgelistet haben, ist nicht Thread Safe. Wenn gleichzeitig mehrere Aufrufe an die Eigenschaft erfolgen, könnten Sie mehrere Aufrufe haben, indem Sie die Eigenschaft auf ein neues List <> -Objekt setzen und dadurch vorhandene Listenwerte mit einem neuen, leeren Objekt <> überschreiben. Um die Get-Accessor zu machen Thread-sicher müssen Sie die Lock statement verwenden, etwa so:
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;
}
}
Wenn Sie jedoch immer die Liste benötigen <> Objekt instanziiert ist es ein wenig einfacher zu erstellen, sie innerhalb des Objektkonstruktor und stattdessen die automatische Eigenschaft verwenden. Wie folgt aus:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
Außerdem, wenn Sie die „set“ Accessor Öffentlichkeit verlassen dann die verzehrende Code wird die Eigenschaft auf Null setzen können, die anderen Verbraucher Code brechen kann. Eine gute Technik, um zu verhindern, dass der konsumierende Code den Eigenschaftswert auf Null setzen kann, besteht darin, den Mengenaccessor als privat festzulegen. Wie folgt aus:
public IList<BCSFilter> BCSFilters { get; private set; }
Eine verwandte Technik ist stattdessen ein IEnumerable <> Objekt aus dem Eigentum zurückzukehren. Auf diese Weise können Sie die Liste <> intern jederzeit durch das Objekt ersetzen und der konsumierende Code wird nicht beeinträchtigt. Um IEnumerable <> zurückzugeben, können Sie einfach das einfache Objekt List <> direkt zurückgeben, da es die Schnittstelle IEnumerable <> implementiert. Wie folgt aus:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}
+1 vereinbart. füge es nicht dort hinzu, wo es nicht notwendig ist. –
Danke Chris für eine klare und präzise Antwort –
Der einzige Nachteil ist, dass diese Initialisierung nicht threadsicher ist, siehe auch Rob Levines Antwort. (Wäre gut, wenn Sie dies in Ihre Antwort integrieren.) – peterchen