Относительно незначительный вопрос, но я не смог найти официальную документацию или даже мнение / обсуждение в блоге.
Проще говоря: когда у меня есть частный объект, единственная цель которого - служить частному лицу 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
это нечто совсем другое.