2009-03-31 31 views
8
public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = delegate { }; 
    private void OnLoggingIn(object sender, EventArgs e) 
    { 
     var handler = LoggingIn; 
     handler(sender, e); 
    } 
// ... 
} 

Trong mã trên, tôi đã khởi tạo LoggingIn trình xử lý sự kiện với đại biểu trống.

Điều đó có ảnh hưởng đến không gian bộ nhớ được sử dụng theo bất kỳ cách nào không? Đặc biệt là khi có hàng trăm hoặc hàng ngàn sự kiện tuyên bố như vậy?Một đại biểu trống sẽ ăn hết bộ nhớ?

+0

Đừ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ó ... –

Trả lời

13

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ớ.

+0

Ồ, tôi nghĩ một phần lý do khiến ứng dụng của tôi chạy tự nhiên với mức sử dụng bộ nhớ cao có thể là do tôi đã khai báo sự kiện bằng trống đại biểu ...; cảm ơn một lần nữa, Jon – Sung

+0

@Sung: Tôi đã hoàn toàn thay đổi câu trả lời của mình. Sẽ quay lại và chỉnh sửa để đặt phiên bản trước đó quá! –

+0

@Sung: Ok, giờ đây đã hoàn thành hơn đáng kể. Bạn có thể kiểm tra xem đây có phải là vấn đề của bạn hay không bằng cách giải mã ứng dụng của bạn. Reflector là tốt cho điều này, nhưng bạn sẽ cần phải nhìn vào IL để chắc chắn về những gì đang thực sự xảy ra. –

-1

Cách thay thế để thực hiện việc này là kiểm tra LoggingIn cho tính rỗng mỗi khi bạn muốn tăng nó. Đó là trách nhiệm được nhiều bộ nhớ chuyên sâu hơn gọi một đại biểu có sản phẩm nào.

+0

Bạn có chạy bất kỳ thử nghiệm nào để hỗ trợ điều này hay chỉ là một giả định? –

+0

No. Tôi chỉ ra một yếu tố hạn chế. Nếu bạn muốn thử nghiệm, bạn có thể viết chúng dễ dàng như bất kỳ ai khác. –

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