2010-08-25 122 views
0

是否需要鎖定_userByNameQuery靜態字段是/否和方式?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; 
    } 
} 

回答

3

使它只讀,而你沒有。它只會在類型初始化的一部分被初始化,並且委託是不可變的。沒問題。

1

標準做法是使靜態成員是線程安全的。原因是你無法控制哪些線程正在訪問靜態成員,比如你可以爲成員實例。但是,這並不意味着你必須使用鎖。像Jon說的那樣,如果你確定這個字段永遠不會改變,那個字段引用的實例是不可變的,那麼你就沒有什麼可擔心的了。將不需要鎖定。

+0

謝謝你的解釋。 – 2010-08-26 10:43:45