2015-03-06 17 views
6

Từ .NET 4 trở đi, Lazy<T> có thể được sử dụng để tạo ra các đối tượng lười biếng. Trực giác, khởi tạo lười biếng cũng có thể được thực hiện trong một thuộc tính công khai getter để cung cấp chức năng tương tự cho người gọi. Tôi tự hỏi nếu Lazy<T> cung cấp bất kỳ lợi thế vốn có nào sau này và do đó sẽ được ưu tiên hơn?Nên lười biếng <T> được ưa thích để khởi tạo lười biếng trong một getter?

Cá nhân, tôi cảm thấy rằng Lazy<> có thể nhanh chóng giảm khả năng đọc mã, nhưng có lẽ tôi vừa thấy nó bị lạm dụng. Trên một mặt cộng, nó đảm bảo an toàn luồng, nhưng có nhiều cấu trúc đồng bộ hóa .NET - có lẽ tôi sai - làm cho nó khá dễ dàng để đạt được cùng một bên trong một getter.

Một số lưu ý cần lưu ý khi chọn phương pháp tiếp cận tốt nhất là gì?

+1

Đưa ra ví dụ về khởi tạo lười biếng đạt được mà không cần 'Lazy '. Nó không dễ dàng như bạn nghĩ. –

+1

bản sao có thể có của [Thuộc tính được lưu trong bộ nhớ cache và Lười biếng ] (http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt) – Default

+1

Mặc định: bỏ lỡ điều đó, cảm ơn. Điều này có thể được đánh dấu là trùng lặp. @Ben Voigt: tương tự như những gì Patrick Hofman mô tả trong câu trả lời của mình. Bên cạnh đó, tôi yêu cầu mọi người downvoting điều này để cung cấp ý kiến ​​về cách câu hỏi này có thể được cải thiện (có thể nói tôi là loại thất vọng bởi cách tích cực trang web này đã trở thành). – w128

Trả lời

7

Lazy<> có thể hữu ích vì nó cũng hỗ trợ đa luồng quá, bạn phải tự xây dựng bản thân khi tạo 'lười' của riêng mình.

Đối với mã không cần đa luồng, đây sẽ là mã hoạt động tốt nhất và có thể đọc được theo ý kiến ​​của tôi (sử dụng toán tử kết hợp không).

return variable ?? (variable = new ClassName()); 

Lưu ý rằng vì mã này không an toàn, bạn có thể gọi new ClassName() nhiều lần.

Bạn nên giới thiệu lock khi đó, và khả năng đọc sẽ giảm. Nếu nó chỉ là để dễ đọc, Lazy<> có thể không phải là xấu trong trường hợp đó.

Ngoài ra, Lazy<> ngăn bạn sử dụng trường sao lưu trong trường hợp thuộc tính được lưu trong bộ nhớ cache.

+0

Vâng, đây chính xác là cách tôi thường tiến hành để thực hiện tải chậm trong bộ nạp - sử dụng toán tử kết hợp null và một số loại khóa. Đối với tôi, nó dường như không dễ đọc hơn là giới thiệu một loạt các biểu thức lambda, vv, nhưng tất nhiên đó là chủ quan và có thể thay đổi từng trường hợp. Nếu không, điều này làm cho cảm giác hoàn hảo - cảm ơn bạn! – w128

+2

@ w128 Tôi sẽ không bao giờ sử dụng "một số loại khóa" thay vì sử dụng 'Lazy ', vì 'Lazy ' đã làm tất cả những gì cho bạn. –

+0

@MatthewWatson: Đó là lý lẽ của tôi quá :) –

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