2011-12-09 32 views
5

Tôi đã chơi xung quanh với các đại biểu, sự kiện và các phương pháp ẩn danh. Làm như vậy một điểm trở nên rất rõ ràng.Đăng ký sự kiện bên trong một hàm tạo?

Nó sẽ không hợp lý hóa quy trình đăng ký bất kỳ phương thức sự kiện hoặc chức năng đại biểu nào trong hàm tạo không?

Thử nghiệm của tôi cho thấy nó hoạt động và nó ngăn bạn không phải khai báo chúng sau khi khởi tạo (như hàm tạo của đối tượng thực hiện nó cho bạn).

Thực tế, hiệu suất là khá tốt. Có bất kỳ hạn chế nào khi sử dụng từ khóa "this" để chỉ đối tượng hiện tại khi xây dựng/instantiating đối tượng không?

Điều này có vẻ rất có ý nghĩa đối với tôi vì tất cả các sự kiện sẽ được kết nối trên bản đồ.

Có bất kỳ khu vực nào có thể là vấn đề không?

Ví dụ:

//Constructor 
public SayHello() 
{ 
    _name = "Unnamed"; 
    _isUpdated = false; 

    // Register event handler via lambda (ananymous method shorthand) 
    this.NameChanged += (object sender, EventArgs e) => { Console.WriteLine(e.message)); }; 
} 

Trả lời

12

Có một số vấn đề tiềm ẩn với cách tiếp cận này. Đầu tiên, về mặt tổng quát hơn, người ta thường ưu tiên sử dụng phương pháp ghi đè lên việc đăng ký các sự kiện tự xuất bản vì lý do hiệu suất. Rõ ràng, điều này là không thể nếu sự kiện được tiếp xúc bởi một lớp dựa trên bên ngoài có nguồn gốc mà phơi bày một sự kiện mà không có một phương pháp overridable tương ứng. Tuy nhiên, việc đăng ký các sự kiện tự xuất bản phải là phương pháp tiếp cận cuối cùng, không phải là cách tiếp cận mặc định.

Vấn đề tiềm năng thứ hai nghiêm trọng hơn, nhưng nó phải làm gì với mã được kích hoạt bởi sự kiện, không phải đối tượng nào phơi bày sự kiện. Ví dụ: hãy xem xét hàm tạo sau:

public Foo(Bar bar) 
{ 
    bar.SomeEvent += (s, e) => this.DoSomething(); 
} 

Nếu thanh kích hoạt SomeEvent trên một chuỗi khác, phương thức DoSomething của cá thể Foo có thể được gọi trước khi cá thể được khởi tạo hoàn toàn. Đây là một vấn đề khá tài liệu trong không gian Java (xem, ví dụ, http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html), nhưng phạm vi bảo hiểm là nhiều sparser cho C# /. NET. http://www.bluebytesoftware.com/blog/2010/06/27/OnPartiallyconstructedObjects.aspx cung cấp một số phạm vi chi tiết cho .NET, nhưng nó có thể nhiều hơn bạn muốn biết ...

+0

Nicole, Điểm tuyệt vời. Điều này thật đúng với gì mà tôi đã tìm kiếm. Ruột của tôi đã nói với tôi rằng việc đơn giản hóa thêm có thể có vấn đề (do đó, bài viết). Trong thử nghiệm mọi thứ có thể làm việc tốt, nhưng trong sản xuất luật Murphy sẽ có hiệu lực ... probabilistically, bất cứ điều gì có thể xảy ra sẽ có đủ thời gian. Với điều này, nếu ứng dụng được đề cập là đa luồng khi bạn tuyên bố cuộc đua (ví dụ: dịch vụ hoặc Cổng Web) sẽ diễn ra tại một thời điểm nào đó. Cảm ơn bạn. – Qubits

1

Tôi không nghĩ rằng có bất kỳ vấn đề. Đó là vào bạn để làm điều đó theo cách đó. Bạn có thể sử dụng chính đối tượng đó trong hàm tạo của nó. Nó cũng sẽ hoạt động, nếu bạn omitt this.

+0

Đó là những gì tôi nghĩ. Tôi tìm thấy nó rất tay "không" phải khai báo các sự kiện ở phía khách hàng (cho rằng đối tượng có thể khởi tạo tất cả các mã). Điều đó nói rằng, chỉ là tìm kiếm bất kỳ cạm bẫy tiềm năng để xem xét. Cho đến nay tôi đã không đi qua bất kỳ ... khác hơn là sử dụng bộ nhớ (mối quan tâm tối thiểu chỉ khi sự kiện không có liên quan). – Qubits

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