Cập nhật (cảm ơn người nhận xét): tính không thể ủy nhiệm có nghĩa là nhân bản không đạt được gì ngoài một bài tập.
Khi một viết:
myDelegate += AHandler
một thể hiện ủy nhiệm hoàn toàn mới được tạo ra và gán cho myDelegate.
Do đó, mã bên dưới sẽ hoạt động giống hệt nhau mà không có cuộc gọi Clone.
MulticastDelegate (loại cơ bản) có phương pháp Clone.
Để có thể truy cập vào đại biểu cơ bản, bạn có thể cần phải tránh trình trợ giúp thông thường mà từ khóa sự kiện tạo và quản lý trực tiếp (tùy chỉnh thêm và xóa người truy cập).
Để hiển thị này:
class Program {
public delegate void MyDelegate(string name);
public event MyDelegate EventOne;
public void HandlerOne(string name) {
Console.WriteLine("This is handler one: {0}", name);
}
public void HandlerTwo(string name) {
Console.WriteLine("This is handler two: {0}", name);
}
public void HandlerThree(string name) {
Console.WriteLine("This is handler three: {0}", name);
}
public void Run() {
EventOne += HandlerOne;
EventOne += HandlerTwo;
Console.WriteLine("Before clone");
EventOne("EventOne");
MyDelegate eventTwo = (MyDelegate)EventOne.Clone();
MyDelegate eventTwo = EventOne;
Console.WriteLine("After
clone
copy");
EventOne("EventOne");
eventTwo("eventTwo");
Console.WriteLine("Change event one to show it is different");
EventOne += HandlerThree;
EventOne("EventOne");
eventTwo("eventTwo");
}
static void Main(string[] args) {
(new Program()).Run();
}
}
Cảm ơn bạn đã chỉ ra điều đó. Đó là tốt nhất cho các sự kiện trong mã của riêng tôi. – weiqure
Cảm ơn bạn rất nhiều vì điều này. Tôi cần một cách giải quyết tốt cho đối tượng nhân bản thông qua serialization nhị phân không được hưởng sự kiện đã đăng ký, hoặc người nào khác tôi đã phải thực hiện ICloneable trong vài trăm lớp. – user1039513