public class SharedCacheData : ISharedCacheData { private readonly ISharedPetsService mPetsService; private static ISharedEmployeeService mSharedEmployeeService; public SharedCacheData(ISharedPetsService petsService, ISharedEmployeeService employeeService) { mPetsService = petsService; mSharedEmployeeService = employeeService; } public static string GetUserFullName(string key) { Hashtable value = HttpContext.Current.Application[USERFULLNAME_KEY] as Hashtable; if (value == null) { value = new Hashtable(); HttpContext.Current.Application[USERFULLNAME_KEY] = value; } if (value.ContainsKey(key)) return value[key] as string; string name = mSharedEmployeeService.FindOneUser(key); value[key] = name; return name; } Whether initialize static field mSharedEmployeeService (service) in constructors?
5 Réponses :
Non, c'est généralement une mauvaise idée. Chaque fois que vous créez une nouvelle instance, il remplacera la variable statique. C'est presque certainement ce que vous voulez faire. P>
Je me demande si réellement em> il devrait y avoir deux classes ici - une pour le service des animaux domestiques et un pour le service des employés. Il est difficile de dire du code présenté, mais ce que nous avons ici ne ressemble vraiment pas à une bonne idée. P>
Pour les personnes qui lisent ceci à l'avenir: j'ajouterais que l'utilisation d'un constructeur statique (comme Mark Robinson Notes), serait la voie à suivre.
@Bkspurgeon: Pas nécessairement. Les initialisateurs de champ statiques peuvent bien suffire, sans constructeur statique réel. Cela dépend de la minuterie requise.
L'initialisation d'un constructeur statique aurait plus de sens:
http://msdn.microsoft.com/en-us/library/k9x6w0hc (v = vs.80) .aspx p>
class SimpleClass { // Static constructor static SimpleClass() { //... } }
Ce n'est pas recommandé et généralement une mauvaise pratique: maintenant un appel à la méthode statique getuserfulname () code> entraînera une exception si aucune instance de
SharedCachedata code> n'a été créée à l'avance . P>
Les champs statiques sont membres de la classe; constructeur sont destinés à créer des membres d'instance. Et initialisation des champs statiques par exemple des CTORS est contraire à la philosphère Oops. Certainement, vous pouvez le faire; Mais cela modifiera la valeur du champ statique pour chaque instance créée pour ce type. P>
Pour initialiser les champs statiques Utilisez Initialiseur statique - qui est appelé au chargement de la classe, c'est-à-dire que tous les membres d'instance ne sont créés - avant les appels de fourmis. P>
Un «constructeur statique» ne construit pas réellement une instance. Je préfère l'appeler un initialiseur statique. P>
Aussi les initialiseurs statiques ne permettent pas de modifier d'accès. P>
L'initialisateur statique et le constructeur statique sont quelque peu différents. Le constructeur statique est le nom de la spécification, donc je vous encourage à l'utiliser même si vous ne l'aimez pas. Initializer statique n'est pas un terme spécifique dont je suis au courant, mais pourrait facilement être utilisé pour un initialiseur statique i> ... mais une classe avec un constructeur statique et une classe juste avec des initialisateurs statiques sur le terrain avoir une synchronisation différente.
Les bonnes pratiques sont "STATIC" Les champs doivent être initialisés en ligne forts> em> espère que cela a du sens.
Ci-dessous des extraits de code pour le même meilleur moyen d'écrire le code ci-dessus p>