Một câu hỏi tương đối nhỏ, nhưng tôi chưa thể tìm thấy tài liệu chính thức hoặc thậm chí ý kiến / thảo luận trên blog về nó.
Nói một cách đơn giản: khi tôi có một đối tượng riêng tư với mục đích duy nhất là phục vụ riêng tư lock
, tôi sẽ đặt tên cho đối tượng đó là gì?
class MyClass
{
private object LockingObject = new object();
void DoSomething()
{
lock(LockingObject)
{
//do something
}
}
}
Chúng ta nên đặt tên LockingObject
ở đây là gì? Cũng xem xét không chỉ tên của biến mà còn trông như thế nào trong mã khi khóa.
Tôi đã thấy nhiều ví dụ khác nhau, nhưng dường như không có lời khuyên chắc chắn nào:
Rất nhiều cách sử dụng
SyncRoot
(và các biến thể như_syncRoot
).- Mẫu mã:
lock(SyncRoot)
,lock(_syncRoot)
- Điều này dường như bị ảnh hưởng bởi
SyncLock
tuyên bố tương đương của VB , thuộcSyncRoot
tính tồn tại trên một số lớp ICollection và một phần của một kiểu mẫu thiết kế SyncRoot (có thể cho là ý tưởng tồi) - Ở trong bối cảnh C #, không chắc tôi có muốn đặt tên VBish không. Thậm chí tệ hơn, trong VB đặt tên biến giống như từ khóa. Không chắc đây có phải là một nguồn gây nhầm lẫn hay không.
- Mẫu mã:
thisLock
vàlockThis
từ các bài viết MSDN: Tuyên bố khóa C # , Tuyên bố VB SyncLock- Mẫu mã:
lock(thisLock)
,lock(lockThis)
- Không chắc chắn nếu những cái này được đặt tên tối thiểu hoàn toàn cho ví dụ hay không
- Thật kỳ lạ nếu chúng ta sử dụng điều này trong một
static
lớp / phương thức. - EDIT: Bài viết Wikipedia về khóa cũng sử dụng cách đặt tên này cho ví dụ của nó
- Mẫu mã:
Một số cách sử dụng
PadLock
(của vỏ khác nhau)- Mẫu mã:
lock(PadLock)
,lock(padlock)
- Không tệ, nhưng thịt bò duy nhất của tôi là nó không gây ngạc nhiên khi gọi hình ảnh của một "ổ khóa" vật lý mà tôi có xu hướng không liên kết với khái niệm luồng trừu tượng .
- Mẫu mã:
Đặt tên khóa dựa trên những gì nó dự định khóa
- Mẫu mã:
lock(messagesLock)
,lock(DictionaryLock)
,lock(commandQueueLock)
- Trong ví dụ trang VB SyncRoot MSDN, nó có một
simpleMessageList
ví dụ với mộtmessagesLock
đối tượng riêng tư - Tôi không nghĩ nên đặt tên cho khóa theo loại bạn đang khóa ("DictionaryLock") vì đó là một chi tiết triển khai có thể thay đổi. Tôi thích đặt tên xung quanh khái niệm / đối tượng bạn đang khóa ("MessagesLock" hoặc "commandQueueLock")
- Thật thú vị, tôi rất hiếm khi thấy quy ước đặt tên này để khóa các đối tượng trong các mẫu mã trực tuyến hoặc trên StackOverflow.
- Mẫu mã:
(EDIT) Thông số C # trong phần "8.12 Tuyên bố khóa" có ví dụ về mẫu này và đặt tên cho mẫu này
synchronizationObject
- Mẫu mã:
lock(SynchronizationObject)
,lock(synchronizationObject)
- Mẫu mã:
Câu hỏi: Ý kiến của bạn nói chung về việc đặt tên các đối tượng khóa riêng là gì?
Gần đây, tôi đã bắt đầu đặt tên cho chúng ThreadLock
(giống như tùy chọn 3), nhưng tôi thấy mình đang đặt câu hỏi cho cái tên đó.
Tôi thường xuyên sử dụng mẫu khóa này (trong mẫu mã được cung cấp ở trên) trong các ứng dụng của mình vì vậy tôi nghĩ rằng có thể có ý kiến / thảo luận chuyên nghiệp hơn về quy ước đặt tên vững chắc cho chúng. Cảm ơn!
SynchronizationContext
là một cái gì đó khá khác nhau.