Làm xước câu trả lời trước (được lưu dưới đây cho hậu thế). Nó phụ thuộc vào việc thực hiện trình biên dịch, nhưng theo trình biên dịch MS C# 3.0 hiện tại, điều này thực sự chỉ tạo ra một cá thể đơn lẻ được tái sử dụng cho mọi cá thể. Nó có thể làm điều đó bởi vì các đại biểu là bất biến và đại biểu không yêu cầu bất kỳ thông tin nào từ cá thể.
Tôi không biết đây có phải là trường hợp của C# 2.0 hay không. Bạn có thể dịch ngược mã của bạn và xem liệu IL có thực sự sử dụng một trường được lưu trong bộ nhớ cache hay không. Sử dụng câu trả lời dưới đây là cách an toàn để bảo đảm bạn sẽ chỉ tạo một trường hợp.
Original câu trả lời:
Vâng, nó tạo ra một thể hiện của một đại biểu. Điều đó sẽ mất một số bộ nhớ. Bạn có thể giảm điều đó mặc dù:
public static class EventHandlers
{
public static readonly EventHandler Empty = delegate {};
}
public sealed class FtpManager
{
public event EventHandler LoggingIn = EventHandlers.Empty;
}
Tại thời điểm đó sẽ chỉ có một trường hợp và bạn có thể tham khảo nó từ bất kỳ đâu. Nhược điểm là các lớp khác sau đó có thể hủy đăng ký sử dụng cùng một trình xử lý. Nếu bạn tin tưởng phần còn lại của codebase của bạn không làm điều đó, đây có lẽ là đặt cược tốt nhất từ một điểm bộ nhớ.
Nguồn
2009-03-31 21:00:55
Đừng quên cuộc gọi phương thức bổ sung có liên quan. Bạn sẽ gọi cả trình xử lý sự kiện và một phương thức trống mà bạn chỉ định thông qua đại biểu ẩn danh. Tôi đã không chạy thử nghiệm nào, nhưng ít nhất bạn nên biết về nó ... –