Ésta es una técnica que yo uso mucho a mí mismo. Esto también puede ayudar a ahorrar recursos de memoria ya que no crea una instancia del objeto List <> a menos que la propiedad de los objetos se esté usando realmente dentro del código de consumo. Esto utiliza una técnica de "carga diferida".
Además, la técnica de "Carga diferida" que ha enumerado no es Thread Safe. Si sucede que hay varias llamadas simultáneamente a la propiedad, podría terminar teniendo múltiples llamadas estableciendo la propiedad en un nuevo objeto List <>, sobrescribiendo en consecuencia cualquier valor existente de la Lista con un nuevo objeto List <> vacío. Para hacer que el acceso Get hilo de seguridad es necesario utilizar el Lock statement, así:
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;
}
}
Sin embargo, si siempre se necesitará la Lista <> instancia de objeto que es un poco más fácil de simplemente crearlo dentro del constructor de objetos y use la propiedad automática en su lugar. Como la siguiente:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
Además, si deja el "set" acceso públicos a continuación, el código de consumir será capaz de establecer la propiedad en nulo que puede romper otro código que consume. Por lo tanto, una buena técnica para evitar que el código de consumo pueda establecer el valor de la propiedad en Nulo es establecer que el acceso del conjunto sea privado. De esta manera:
public IList<BCSFilter> BCSFilters { get; private set; }
Una técnica relacionada es devolver un <> objeto IEnumerable de la propiedad en su lugar. Esto le permitirá reemplazar el List <> escriba internamente dentro del objeto en cualquier momento y el código de consumo no se verá afectado. Para devolver IEnumerable <> puede simplemente devolver el objeto List simple <> directamente ya que implementa la interfaz IEnumerable <>. Como la siguiente:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}
+1 de acuerdo. no lo agregue donde no sea necesario. –
Gracias Chris por una respuesta clara y concisa –
El único inconveniente es que esta inicialización no es segura para subprocesos, consulte también la respuesta de Rob Levine. (Sería bueno si incorpora esto en su respuesta.) – peterchen