2011-02-04 24 views
16

Có ai biết tại sao Microsoft không bao gồm một phương thức Clear() hoặc thuộc tính IsDirty hoặc một cái gì đó giống như lớp Lazy < T> trong .NET Framework 4.0? (Cập nhật câu hỏi bên dưới)Phương thức reinitialization lười biếng <T>?

Chúng tôi có loại homebrew mà chúng tôi đã sử dụng từ .NET 3.5, nơi tôi làm việc giống với lớp Lazy < T> cho phép bạn có thể đánh giá lại Func lười biếng . Chúng tôi muốn thay thế lớp của chúng tôi bằng .NET mới nhưng cơ chế Clear() hoặc IsDirty này không tồn tại.

Hãy để tôi kể lại câu hỏi gốc dựa trên nhận xét. Có cách nào để reinitialize Lazy < T> Func phương pháp mà không cần reinstantiating lớp? Nếu không, có cách nào để thực hiện nó như là một phương pháp mở rộng hoặc chỉ là một mô hình xấu để làm theo ở nơi đầu tiên?

+7

"Tại sao không" câu hỏi chỉ là những câu hỏi. Bạn có thể diễn đạt lại điều này một cách mang tính xây dựng hơn không? –

+0

Thêm phương thức mở rộng ... –

+0

Tôi đoán vì nó được xem là giá trị và giá trị khác không phải là giá trị giống nhau. – Skurmedel

Trả lời

10

Vì không thể đảm bảo an toàn cho luồng. Các lớp học mà bảo đảm rằng người lập trình sẽ bắn chân của mình mà không có bất kỳ cách nào để khắc phục sự cố không thuộc về một khung công tác. Bạn được tự do để bắn chân của bạn ra.

+2

An toàn chủ đề là một tùy chọn cho lớp Lười biếng - và có lẽ không phải là mặc định. Do đó, câu trả lời này không áp dụng nhiều. – flq

+1

Tại sao nó * không thể * để làm cho chủ đề an toàn? Đó không phải là chỉ là một bản cập nhật bên trong một khối khóa và một số khóa thêm vào hai thuộc tính ('IsValueCreated' và' Value')? Tôi không phải là một chuyên gia về đa luồng, nhưng có vẻ như khả thi ngay từ cái nhìn đầu tiên ... – user2173353

1

IsValueCreated không hoạt động cho bạn?

+1

IsValueCreated là chỉ đọc ... nó sẽ xảy ra nếu tài sản có setter và gây ra reinitialization xảy ra trong lần sử dụng tiếp theo. –

6

Những gì bạn muốn làm không phải là khởi tạo Lazy, nó là cái gì khác. Đó là lý do tại sao nó không thuộc lớp Lazy<T>.

4

Vì điều đó sẽ phá vỡ ngữ nghĩa của loại. Nếu trạng thái của Lazy<T> trở nên không hợp lệ theo thời gian, bạn cần phải xem xét một loại khác.

2

Nếu bạn thực sự cần đặt lại đối tượng Lazy <> bạn cần có cơ chế tạo phiên bản mới của Lazy <> nhập. Bạn có thể xây dựng một trình bao bọc cho thấy các thuộc tính giống như Lazy <> type cộng với phương thức Reset mà chỉ đơn giản là tái tạo nó. Nói một cách đơn giản, nó sẽ giống như sau:

public class ResettableLazy<T> 
{ 
    public T Value => this.Container.Value; 
    public bool IsValueCreated => this.Container.IsValueCreated; 
    public void Reset() { this.Container = new Lazy<T>(); } 
    private Lazy<T> Container = new Lazy<T>(); 
} 

Câu hỏi thực sự là bạn nên làm điều gì đó như thế, nhưng nếu bạn thực sự cần điều đó có thể đủ cho nhu cầu của bạn.

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