2013-02-27 19 views
6

Về cơ bản, tiêu đề cho biết. Whats sự khác biệt giữa hai (Tôi hiện đang sử dụng một trong những đầu tiên)Sự khác biệt giữa EventHandler riêng tư và sự kiện riêng tư EventHandler?

private EventHandler _progressEvent; 

private event EventHandler _progressEvent; 

Tôi có một phương pháp

void Download(string url, EventHandler progressEvent) { 
    doDownload(url) 
    this._progressEvent = progressEvent; 
} 

Phương pháp doDownload sẽ gọi

_progressEvent(this, new EventArgs()); 

Nó hoạt động tốt, cho đến nay. Nhưng tôi cảm thấy tôi đang làm điều gì đó khủng khiếp sai.

Trả lời

8

Đầu tiên xác định đại biểu, thứ hai xác định sự kiện. Cả hai có liên quan, nhưng chúng thường được sử dụng rất khác nhau.

Nói chung, nếu bạn đang sử dụng EventHandler hoặc EventHandler<T>, điều này sẽ gợi ý rằng bạn đang sử dụng sự kiện. Người gọi (để xử lý tiến trình) thường sẽ là đăng ký cho sự kiện (không chuyển qua người được ủy quyền) và bạn sẽ tăng sự kiện nếu bạn có người đăng ký.

Nếu bạn muốn sử dụng một phương pháp tiếp cận chức năng hơn, và vượt qua trong một đại biểu, tôi sẽ chọn một đại biểu thích hợp hơn để sử dụng. Trong trường hợp này, bạn không thực sự cung cấp bất kỳ thông tin nào trong số EventArgs, vì vậy có lẽ chỉ cần sử dụng System.Action sẽ phù hợp hơn.

Điều đó đang được nói, một cách tiếp cận sự kiện xuất hiện phù hợp hơn ở đây, từ mã nhỏ được hiển thị. Để biết chi tiết về cách sử dụng các sự kiện, hãy xem Events trong Hướng dẫn lập trình C#.

Mã của bạn, sử dụng các sự kiện, có khả năng sẽ giống như thế:

// This might make more sense as a delegate with progress information - ie: percent done? 
public event EventHandler ProgressChanged; 

public void Download(string url) 
{ 
    // ... No delegate here... 

Khi bạn gọi tiến bộ của bạn, bạn muốn viết:

var handler = this.ProgressChanged; 
if (handler != null) 
    handler(this, EventArgs.Empty); 

Người dùng này sẽ viết những dòng này như sau:

yourClass.ProgressChanged += myHandler; 
yourClass.Download(url); 
+0

Tôi đoán tôi không thực sự cần sự kiện có thật, bởi vì tôi sẽ chỉ có 1 thuê bao và tôi cần phải vượt qua các đại biểu xung quanh. Cảm ơn vì sự trả lời. –

1

Tôi không nghĩ có sự khác biệt giữa hai điều này.

Từ khóa sự kiện là công cụ sửa đổi truy cập như nội bộ và được bảo vệ riêng tư. Nó được sử dụng để hạn chế quyền truy cập vào các đại biểu đa phương tiện.

Đi từ dễ thấy nhất để ít nhất có thể nhìn thấy chúng tôi có

public EventHandler _progressEvent; 
//can be assigned to from outside the class (using = and multicast using +=) 
//can be invoked from outside the class 

public event EventHandler _progressEvent; 
//can be bound to from outside the class (using +=) 
//can be invoked from inside the class 

private EventHandler _progressEvent; 
//can be bound from inside the class (using = or +=) 
//can be invoked inside the class 

private event EventHandler _progressEvent; 
//Same as private. given event restricts the use of the delegate from outside 
// the class - i don't see how private is different to private event