web-dev-qa-db-fra.com

Initialiser un champ statique ou renvoyer une valeur dans une propriété statique

A) Dans le code suivant, la méthode DataTools.LoadSearchList() ne sera-t-elle appelée qu'une seule fois ou à chaque accès à la propriété?

public static IEnumerable<string> SearchWordList
{
    get
    {
        return DataTools.LoadSearchList();
    }
}

B) Y a-t-il une différence avec cela?

public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();
29
magnattic

Dans votre premier exemple, LoadSearchList () sera appelé à chaque accès à la propriété.

Dans le second, LoadSearchList () ne sera appelé qu'une seule fois (mais il sera appelé que vous l'utilisiez ou non car il s'agit désormais d'un champ plutôt que d'une propriété).

Une meilleure option pourrait être:

private static IEnumerable<string> _searchWordList;

public static IEnumerable<string> SearchWordList
{
    get 
    { 
        return _searchWordList ?? 
            ( _searchWordList = DataTools.LoadSearchList()); 
    }
}

Ou si vous utilisez .NET 4.0 et que vous voulez quelque chose de thread-safe, vous pouvez utiliser Lazy<T>, comme l'a mentionné Jon Skeet (je pense que la syntaxe devrait être correcte, mais ne m'y tenez pas):

private static Lazy<IEnumerable<string>> _searchWordList =
    new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList());

public static IEnumerable<string> SearchWordList
{
    get { return _searchWordList.Value; }
}
37
Justin Niessner

Dans le premier cas, la méthode sera appelée à chaque accès à la propriété. Lorsqu'il est défini en tant que champ, il sera exécuté exactement une fois - lorsque le type qu'il a initialisé - qu'il soit ou non jamais accessible.

Si vous voulez une valeur initialisée paresseusement, je recommanderais Lazy<T> à partir de .NET 4.

15
Jon Skeet

Oui, la propriété appellera DataTools.LoadSearchList () à chaque accès. Le champ statique n'appellera la méthode qu'une seule fois.

2
Torbjörn Hansson