Đây là một câu hỏi tiếp theo cho câu hỏi khác này.
Lý lịch
Làm việc từ Hướng dẫn dành cho đại biểu MSDN (C #) , tôi thấy như sau:
Lưu ý rằng một khi một đại biểu được tạo, phương thức được liên kết với không bao giờ thay đổi - các đối tượng ủy nhiệm là bất biến.
Và sau đó, trong mẫu mã, tôi thấy điều này (Trải ra một chút thông qua mã):
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
Câu hỏi
Bây giờ rõ ràng, cách viết mã ở đây một đại biểu mới được tạo cho mỗi quy trình. Tôi đoán sự bất biến có liên quan nếu bạn cố gắng làm những việc như
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
Mà nên ... vẫn biên dịch khi thisIsATest
bất biến? Vậy Microsoft đã giải quyết vấn đề gì bằng cách biến nó thành bất biến? Những vấn đề nào chúng ta sẽ gặp phải nếu C # 6 làm cho các đại biểu có thể thay đổi?
BIÊN TẬP
Tôi tin rằng sự bất biến sẽ ngăn chặn điều này:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
nhưng sự bất biến sẽ KHÔNG ngăn chặn điều này:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
Tôi có đúng theo cách hiểu này không?
Func<int>
việc trả lại 1 lần đầu tiên là hoàn toàn hợp pháp thời gian nó được gọi, 2 giây, v.v .-- điều này về cơ bản giống như một vật thể đột biến.