En su primer ejemplo, se llamará a LoadSearchList() cada vez que se accede a la propiedad.
En el segundo, LoadSearchList() solo se llamará una vez (pero se llamará si lo usa o no, ya que ahora es un campo en lugar de una propiedad).
Una mejor opción podría ser:
private static IEnumerable<string> _searchWordList;
public static IEnumerable<string> SearchWordList
{
get
{
return _searchWordList ??
(_searchWordList = DataTools.LoadSearchList());
}
}
O si está utilizando .NET 4.0 y quieren algo seguro para subprocesos se puede utilizar Lazy<T>
, como se mencionó Jon Skeet (creo que la sintaxis debe ser correcta, pero no me retiene):
private static Lazy<IEnumerable<string>> _searchWordList =
new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList());
public static IEnumerable<string> SearchWordList
{
get { return _searchWordList.Value; }
}
Las propiedades y los campos se comportan de forma completamente diferente, aunque pueden parecer similares desde un punto de vista de codificación. Una propiedad es en realidad solo un acceso directo para un par de métodos get/set, y como cualquier método, el cuerpo se ejecutará cada vez que lo llame. – MattDavey