Относительно незначительный вопрос, но я не смог найти официальную документацию или даже мнение / обсуждение в блоге.
Проще говоря: когда у меня есть частный объект, единственная цель которого - служить частному лицу lock
, как я называю этот объект?
class MyClass
{
private object LockingObject = new object();
void DoSomething()
{
lock(LockingObject)
{
//do something
}
}
}
Что мы должны назвать LockingObject
здесь? Также учитывайте не только имя переменной, но и то, как она выглядит в коде при блокировке.
Я видел различные примеры, но, казалось бы, нет твердых советов:
Много использования
SyncRoot
(и варианты, такие как_syncRoot
).- Пример кода:
lock(SyncRoot)
,lock(_syncRoot)
- Похоже, на это влияет эквивалентное
SyncLock
утверждение VB ,SyncRoot
свойство, которое существует в некоторых классах ICollection и часть некоторого шаблона проектирования SyncRoot (что, возможно, является плохой идеей) - Находясь в контексте C #, не уверен, хочу ли я иметь именование VBish. Хуже того, в VB именование переменной совпадает с ключевым словом. Не уверен, если это будет источником путаницы или нет.
- Пример кода:
thisLock
иlockThis
из статей MSDN: оператор блокировки C # , оператор VB SyncLock- Пример кода:
lock(thisLock)
,lock(lockThis)
- Не уверен, были ли они названы минимально чисто для примера или нет
- Довольно странно, если мы используем это в
static
классе / методе. - РЕДАКТИРОВАТЬ: статья Википедии о замках также использует это наименование в качестве примера
- Пример кода:
Несколько использования
PadLock
(различного кожуха)- Пример кода:
lock(PadLock)
,lock(padlock)
- Неплохо, но мой единственный недостаток в том, что он неудивительно вызывает образ физического «замка», который я склонен не ассоциировать с концепцией абстрактного потока .
- Пример кода:
Называя блокировку, основываясь на том, что она собирается заблокировать
- Пример кода:
lock(messagesLock)
,lock(DictionaryLock)
,lock(commandQueueLock)
- В примере страницы MSDN VB SyncRoot у него есть
simpleMessageList
пример с закрытымmessagesLock
объектом - Я не думаю, что будет хорошей идеей называть блокировку для типа, который вы блокируете ("DictionaryLock"), так как это может быть изменено в деталях реализации. Я предпочитаю именовать концепцию / объект, который вы блокируете ("messagesLock" или "commandQueueLock")
- Интересно, что я очень редко вижу это соглашение об именах для блокировки объектов в примерах кода онлайн или в StackOverflow.
- Пример кода:
(РЕДАКТИРОВАТЬ) Спецификация C # в разделе "8.12 Оператор блокировки" имеет пример этого шаблона и называет его
synchronizationObject
- Пример кода:
lock(SynchronizationObject)
,lock(synchronizationObject)
- Пример кода:
Вопрос: Каково ваше мнение вообще об именовании частных объектов запирающих?
Недавно я начал называть их ThreadLock
(как вариант 3), но я сомневаюсь, что это имя.
Я часто использую этот шаблон блокировки (в приведенном выше примере кода) во всех своих приложениях, поэтому я подумал, что может иметь смысл получить более профессиональное мнение / дискуссию о твердом соглашении об именах для них. Благодарность!
источник
SynchronizationContext
это нечто совсем другое.Я обычно называю это
locker
, но так как это личное, я считаю, что это несколько неважная деталь реализации. Первое правило, используйте стандарты вашей команды / компании. Если его нет, ну, пожалуйста, сделайте его и используйте, но, делая его, сделайте все просто. Если у вашего класса есть один блокирующий объект, вызывать егоfoo
достаточно хорошо. Если у вас их много, хорошим порядком бизнеса может быть просто пересмотр дизайна этого класса, чтобы посмотреть, не делает ли он слишком много разных вещей. Но если нет, то имя становится важным, как в этом полностью надуманном примере:источник
Я всегда использовал lck_. Таким образом, если вы нажмете ctrl + f 'lck', вам нужно будет найти только блокировки, в то время как 'lock' также найдет такие вещи, как 'clock'.
Такие вещи, как lockThis и Padlock, хороши для универсальных портфелей, но для правильных проектов вам действительно следует использовать семантические имена, чтобы при взгляде на объявления вы знали, что на самом деле делает объект, не просматривая код.
источник