C # блокировка статического поля - PullRequest
0 голосов
/ 25 августа 2010

Нужна ли блокировка для статического поля _userByNameQuery Да / Нет и способ?

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;
    }
}

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Сделайте это только для чтения, а вы нет.Он будет инициализирован только один раз во время инициализации типа, и делегаты будут неизменными.Нет проблем.

1 голос
/ 25 августа 2010

Это стандартная практика, чтобы сделать статические члены потокобезопасными. Причина в том, что вы не можете контролировать, какие потоки обращаются к статическим элементам, как, например, члены. Однако это не означает, что вы должны использовать замки. Как сказал Джон, если вы убедитесь, что поле никогда не изменится и что экземпляр, на который ссылается это поле, является неизменяемым, вам не о чем беспокоиться. Там не будет необходимости в замке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...