2010-08-25 90 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