2010-08-25 6 views
0

Ai-je besoin d'un verrouillage pour le champ statique _userByNameQuery Oui/Non et de façon?Verrouillage de champ statique C#

public class SomeClass 
{ 
    static Func<Entities, string, IQueryable<User>> _userByNameQuery = 
     CompiledQuery.Compile<Entities, string, IQueryable<User>> 
      ((context, userName) => 
       context.Users.Where(u => u.UserName.ToUpper() == userName)); 

    public bool UserNameExists(string userName) 
    { 
     userName = userName.ToUpper(); 
     return _userByNameQuery.Invoke(DataContext, userName).Count() > 0; 
    } 
} 

Répondre

3

Faites-le en lecture seule, et vous ne le faites pas. Il sera initialisé juste une fois lors de l'initialisation du type, et les délégués sont immuables. Aucun problème.

1

Il est de pratique courante de rendre les éléments statiques sans risque de thread. La raison en est que vous ne pouvez pas contrôler quels threads accèdent à des membres statiques comme vous pouvez le faire par exemple pour les membres. Cependant, cela ne signifie pas que vous devez utiliser des verrous. Comme Jon l'a dit, si vous vous assurez que le champ ne peut jamais changer et que l'instance référencée par ce champ est immuable, alors vous n'avez rien à craindre. Il n'y aurait pas besoin de verrou.

+0

Merci pour vos explications. –