Відносно незначне питання, але мені не вдалося знайти офіційну документацію або навіть думку / дискусії щодо цього блогу.
Простіше кажучи: коли я маю приватний об'єкт, єдиною метою якого є служіння приватному 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
класі / методі. - EDIT: Стаття Вікіпедії про блокування також використовує цю назву для свого прикладу
- Зразок коду:
Кілька звичаїв
PadLock
(різного корпусу)- Приклад коду:
lock(PadLock)
,lock(padlock)
- Непогано, але моя єдина яловичина - це те, що вона не дивно викликає зображення фізичного «замка», який я, як правило, не асоціюю з абстрактною концепцією нарізки .
- Приклад коду:
Іменування блокування на основі того, що він має намір заблокувати
- Приклад коду:
lock(messagesLock)
,lock(DictionaryLock)
,lock(commandQueueLock)
- У прикладі сторінки VB SyncRoot MSDN він має
simpleMessageList
приклад із приватнимmessagesLock
об'єктом - Я не думаю, що це гарна ідея називати замок проти типу, який ви замикаєте ("DictionaryLock"), оскільки це детальна інформація про реалізацію, яка може змінитися. Я вважаю за краще називати навколо поняття / об'єкта, який ви блокуєте ("messagesLock" або "commandQueueLock")
- Цікаво, що я дуже рідко бачу цю умову іменування для блокування об'єктів у зразках коду в Інтернеті або на StackOverflow.
- Приклад коду:
(EDIT) Специфікація C # у розділі "8.12 Заява про блокування" містить приклад цього шаблону та називає його
synchronizationObject
- Приклад коду:
lock(SynchronizationObject)
,lock(synchronizationObject)
- Приклад коду:
Питання: Яка ваша думка взагалі щодо іменування приватних блокуючих об'єктів?
Нещодавно я почав називати їх ThreadLock
(так начебто як варіант 3), але я опитуюсь на цьому імені.
Я часто використовую цю схему блокування (у наведеному вище зразку коду) протягом моїх додатків, тому я вважав, що може мати сенс отримати більш професійну думку / дискусію щодо твердої угоди про іменування для них. Спасибі!
SynchronizationContext
це щось зовсім інше.