Các sự kiện khá dễ dàng trong C #, nhưng các tài liệu MSDN theo ý kiến của tôi khiến chúng khá khó hiểu. Thông thường, hầu hết các tài liệu bạn thấy đều thảo luận về việc tạo một lớp kế thừa từ EventArgs
lớp cơ sở và có lý do cho điều đó. Tuy nhiên, đây không phải là cách đơn giản nhất để tạo sự kiện và đối với ai đó muốn thứ gì đó nhanh chóng, dễ dàng và trong thời gian ngắn, sử dụngAction
loại hình chính là tấm vé của bạn.
Tạo sự kiện & đăng ký tham gia
1. Tạo sự kiện của bạn trên lớp của bạn ngay sau khi class
khai báo.
public event Action<string,string,string,string>MyEvent;
2. Tạo phương thức lớp xử lý sự kiện trong lớp của bạn.
private void MyEventHandler(string s1,string s2,string s3,string s4)
{
Console.WriteLine("{0} {1} {2} {3}",s1,s2,s3,s4);
}
3. Bây giờ khi lớp của bạn được gọi, hãy yêu cầu nó kết nối sự kiện với trình xử lý sự kiện mới của bạn. Lý do +=
toán tử được sử dụng là vì bạn đang thêm trình xử lý sự kiện cụ thể của mình vào sự kiện. Bạn thực sự có thể làm điều này với nhiều trình xử lý sự kiện riêng biệt và khi một sự kiện được đưa ra, mỗi trình xử lý sự kiện sẽ hoạt động theo trình tự mà bạn đã thêm chúng.
class Example
{
public Example()
{
MyEvent += new Action<string,string,string,string>(MyEventHandler);
}
}
4. Bây giờ, khi bạn đã sẵn sàng, hãy kích hoạt (hay còn gọi là tăng) sự kiện ở đâu đó trong mã lớp của bạn như sau:
MyEvent("wow","this","is","cool");
Kết quả cuối cùng khi bạn chạy nó là bàn điều khiển sẽ phát ra "wow this is cool". Và nếu bạn đã thay đổi "mát mẻ" bằng một ngày hoặc một chuỗi và chạy trình kích hoạt sự kiện này nhiều lần, bạn sẽ thấy kết quả xuất hiện trong một chuỗi FIFO giống như các sự kiện thường hoạt động.
Trong ví dụ này, tôi đã truyền 4 chuỗi. Nhưng bạn có thể thay đổi chúng thành bất kỳ loại nào có thể chấp nhận được hoặc sử dụng nhiều hơn hoặc ít hơn các loại hoặc thậm chí xóa<...>
và không chuyển gì cho trình xử lý sự kiện của bạn.
Và, một lần nữa, nếu bạn có nhiều trình xử lý sự kiện tùy chỉnh và đăng ký tất cả chúng vào sự kiện của bạn với +=
toán tử, thì trình kích hoạt sự kiện của bạn sẽ gọi tất cả chúng theo trình tự.
Xác định Người gọi Sự kiện
Nhưng nếu bạn muốn xác định người gọi sự kiện này trong trình xử lý sự kiện của mình thì sao? Điều này hữu ích nếu bạn muốn một trình xử lý sự kiện phản ứng với các điều kiện dựa trên người đã nêu ra / kích hoạt sự kiện. Có một số cách để làm điều này. Dưới đây là các ví dụ được hiển thị theo thứ tự tốc độ hoạt động của chúng:
Tùy chọn 1. (Nhanh nhất) Nếu bạn đã biết nó, hãy chuyển tên dưới dạng chuỗi ký tự cho trình xử lý sự kiện khi bạn kích hoạt nó.
Tùy chọn 2. (Hơi nhanh) Thêm chuỗi này vào lớp của bạn và gọi nó từ phương thức gọi, sau đó chuyển chuỗi đó đến trình xử lý sự kiện khi bạn kích hoạt nó:
private static string GetCaller([System.Runtime.CompilerServices.CallerMemberName] string s = null) => s;
Tùy chọn 3. (Ít nhanh nhất nhưng vẫn nhanh) Trong trình xử lý sự kiện của bạn khi bạn kích hoạt nó, hãy lấy chuỗi tên phương thức gọi với sau:
string callingMethod = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().ReflectedType.Name.Split('<', '>')[1];
Hủy đăng ký khỏi sự kiện
Bạn có thể có một tình huống trong đó sự kiện tùy chỉnh của bạn có nhiều trình xử lý sự kiện, nhưng bạn muốn xóa một trình xử lý đặc biệt ra khỏi danh sách trình xử lý sự kiện. Để làm như vậy, hãy sử dụng -=
toán tử như sau:
MyEvent -= MyEventHandler;
Tuy nhiên, một lời cảnh báo nhỏ với điều này. Nếu bạn làm điều này và sự kiện đó không còn bất kỳ trình xử lý sự kiện nào nữa và bạn kích hoạt lại sự kiện đó, sự kiện đó sẽ đưa ra một ngoại lệ. (Tất nhiên là có ngoại lệ, bạn có thể mắc bẫy bằng các khối thử / bắt.)
Xóa tất cả các sự kiện
Được rồi, giả sử bạn đã vượt qua các sự kiện và bạn không muốn xử lý thêm nữa. Chỉ cần đặt nó thành null như vậy:
MyEvent = null;
Thận trọng tương tự đối với các sự kiện Hủy đăng ký cũng ở đây. Nếu trình xử lý sự kiện tùy chỉnh của bạn không còn bất kỳ sự kiện nào nữa và bạn kích hoạt lại, chương trình của bạn sẽ có một ngoại lệ.