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