2010-11-01 36 views
12

Mọi người đều sử dụng nhiều Danh sách. Tôi cần phải lặp qua danh sách này, vì vậy tôi sử dụng mẫu SyncRoot đã biết.Danh sách <T> không triển khai SyncRoot!

Gần đây, tôi nhận thấy trong bài đăng this rằng SyncRoot nên tránh để ủng hộ "an toàn luồng" được nhúng (mỗi phương pháp sẽ khóa trên một đối tượng riêng tư mà không lộ nó bằng thuộc tính SyncRoot). Tôi có thể hiểu nó, và một phần tôi đồng ý về điều đó.

Câu hỏi đặt ra là List<T> lớp không triển khai thuộc tính SyncRoot, ngay cả khi triển khai giao diện ICollection, hiển thị thuộc tính SyncRoot. Tôi nói điều này BAUSE mã

List<int> list = new List<int>() 
list.SyncRoot; 

cung cấp cho tôi những lỗi biên dịch sau:

error CS0117: 'System.Collections.Generic.List' does not contain a definition for 'SyncRoot'

... Nếu điều này là đúng, làm thế nào tôi có thể đồng bộ hóa một tài sản công cộng của loại List <T> khi iterating qua nó?

+1

Tôi chưa bao giờ tìm thấy SyncRoot hoạt động tốt trong cuộc sống thực, vì khóa có xu hướng hoạt động tốt hơn ở mức cao hơn, thay vì chỉ khóa các bộ sưu tập duy nhất –

Trả lời

18

Nó thực sự được triển khai một cách rõ ràng.

object ICollection.SyncRoot 
{ 
    get 
    { 
     if (this._syncRoot == null) 
     { 
      Interlocked.CompareExchange(ref this._syncRoot, new object(), null); 
     } 
     return this._syncRoot; 
    } 
} 

Điều này có nghĩa là bạn phải truyền tới ICollection để sử dụng.

+1

Tuyệt, điều đó là chính xác. Tôi không biết về triển khai rõ ràng, cảm ơn. – Luca

+0

Có thể khuyến khích thực hiện rõ ràng thuộc tính SyncRoot ngay cả trên các lớp của riêng tôi không? (Tôi có triển khai tùy chỉnh các bộ sưu tập) Tôi nghĩ rằng nó có thể ngăn cản việc sử dụng SyncRoot. – Luca

+3

Việc sử dụng SyncRoot thực sự không được khuyến khích vì lý do đó nó được thực hiện một cách rõ ràng. Tôi thấy các thành viên thực hiện rõ ràng hữu ích đặc biệt là trong hai kịch bản: 1. Việc sử dụng thành viên không sử dụng bên ngoài giao diện (xem ví dụ này: http://bit.ly/crLXAz) 2. Thành viên chưa được triển khai và ném một ngoại lệ (xem ví dụ này http://bit.ly/3RFzn4 trong đó một phương thức 'Add' không có ý nghĩa trên' ReadOnlyDictionary'). – Steven

Các vấn đề liên quan