Có một diễn viên từ ConcurrentDictionary đến IDictionary cắt bỏ việc thực hiện an toàn thread, vì IDictionary không có phương thức GetOrAdd và AddOrUpdate?Truyền từ ConcurrentDictionary sang IDictionary
Trả lời
Đối tượng kết quả sẽ vẫn là một từ điển đồng thời. Các cuộc gọi như Thêm hoặc Xóa sử dụng triển khai bên dưới TryAdd và TryRemove (an toàn chỉ chuỗi). Việc truyền một đối tượng sang một kiểu khác không thay đổi chính đối tượng đó.
Ngoài ra, để làm rõ, bạn có thể sử dụng các công cụ như ILSpy để xem việc thực hiện các phương pháp IDictionary mặc định là những gì và liệu họ sẽ vẫn thread-safe.
Bạn cũng có thể xem tài liệu MSDN cho triển khai của 'IDictionary
IDictionary
chỉ là một giao diện. Nếu bạn truyền đến nó, kết quả là việc triển khai ConcurrentDictionary, thiếu các phương thức GetOrAdd
và AddOrUpdate
.
Có lẽ, bạn vẫn có thể sử dụng Item
bất động sản và các Add
và ContainsKey
phương pháp (thay cho GetOrAdd
và AddOrUpdate
) phương pháp, và đối tượng đúc của bạn vẫn sẽ được thread-safe (kể từ khi thực hiện cơ bản là một ConcurrentDictionary
).
Nó sẽ giống như nhìn vào đối tượng lớn ConcurrentDictionary
qua IDictionary
lỗ khóa hình - bạn chỉ có thể nhìn thấy hình dạng IDictionary
nhưng nó vẫn sẽ là ConcurrentDictionary
.
Trả lời ngắn gọn.
Bạn đang thao tác một đối tượng thông qua giao diện và do đó vẫn sử dụng triển khai cụ thể. Bạn không mất bất kỳ chức năng cũng như phương pháp của nó. Họ chỉ là không có sẵn.
Trên mặt lưu ý, bạn cần một diễn viên rõ ràng khi downcasting, không cần cho một diễn viên rõ ràng khi upcasting - luôn luôn an toàn để làm như vậy.
xin lỗi nhưng ConcurrentDictionary thêm hai mới phương pháp và ẩn những người khác, do đó, việc triển khai của nó có thể thêm chủ đề an toàn chỉ cho các phương pháp mới, chứ không phải cho các phương thức ẩn. Tài liệu MSDN không làm rõ nó, vì vậy tôi hỏi nó.Nhưng sau khi tôi đọc những bình luận tốt nhất và tôi đã xem xét nguyên mẫu ConcurrentDictionary, tôi thấy nó không mở rộng từ điển, và điều này khiến tôi yên tâm rằng việc truyền nó sang IDictionary sẽ gián tiếp sử dụng từ điển phiên bản mở rộng. – Luciano
- 1. Cách tốt nhất để dịch từ IDictionary sang IDictionary chung là
- 2. Truyền mảng từ MVC sang javascript?
- 3. Truyền từ điển KeyCollection sang mảng String
- 4. Cách truyền từ char * sang T *?
- 5. Không thể truyền từ ActionProvider sang ShareActionProvider
- 6. .NET - Khóa từ điển so với ConcurrentDictionary
- 7. SupportMapFragment - không thể truyền từ Fragment sang MapFragment
- 8. Làm cách nào để truyền từ System.Web.HttpPostedFileBase sang System.Web.HttpPostedFile?
- 9. Truyền mảng byte từ mã gốc sang phía Java
- 10. Cách tốt nhất để truyền từ Động vật [] sang Chó []
- 11. Truyền dữ liệu từ lớp PHP sang PHPExcel qua AJAX
- 12. ConcurrentDictionary - từ điển bị hỏng hoặc mã không hợp lệ?
- 13. Cách truyền IntPtr sang byte *
- 14. IDictionary to SelectList?
- 15. Truyền sang loại chung trong C#
- 16. Truyền mảng sang hàm trong C++
- 17. Sắp xếp một ConcurrentDictionary bởi Value
- 18. com.sun.xml.ws.message.saaj.SAAJHeader không thể truyền sang com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader
- 19. C# 4.0: truyền động sang tĩnh
- 20. Truyền biến số toàn cục sang hàm
- 21. java.math.BigInteger không thể truyền sang java.lang.Long
- 22. java.math.BigInteger không thể truyền sang java.lang.Integer
- 23. truyền loại ẩn danh sang giao diện?
- 24. Truyền mảng sang hàm SOAP trong PHP
- 25. Cách khởi tạo IDictionary trong hàm tạo?
- 26. Phương pháp xóa đồng thời của ConcurrentDictionary Loại bỏ
- 27. Truyền tham số của C# DateTime sang SQL Server 2005?
- 28. Truyền một ManagedObjectContext sang chế độ xem thứ hai
- 29. IDictionary <string, string> hoặc NameValueCollection
- 30. IDictionary <string, string> hoặc NameValueCollection
Bạn có ý nghĩa "cắt" chính xác như thế nào? Nó có xóa nó khỏi 'ConcurrentDictionary' không? Không. Nó có sẵn từ giao diện 'IDictionary' không? Số –
@JamesMichaelHare: Anh ấy có nghĩa là, nếu bạn chuyển sang 'IDictionary', nó có làm cho đối tượng kết quả không an toàn không? Nói cách khác, nó biến nó thành một từ điển thông thường? –
Thiết bị có an toàn không? Có nguy hiểm vì nó có thể được mà không có những hoạt động. Đó là, nếu bạn cần một nguyên tử 'GetOrAdd()' bạn sẽ được ra khỏi may mắn. –