Tôi đã tìm thấy hai cách khác nhau để khởi tạo một Đại biểu với một Hành động:Hành động để ủy quyền: Hành động mới hoặc truyền Hành động?
Tạo một hành động mới hoặc truyền tới Hành động.
Delegate foo = new Action(() => DoNothing(param));
Delegate bar = (Action)(() => DoNothing(param));
Có sự khác biệt giữa 2 cú pháp này không?
Cái nào tốt hơn và tại sao?
Edit:
đại biểu là sử dụng trong ví dụ này vì cú pháp rất hữu ích để gọi các phương thức như BeginInvoke hoặc Gọi với một biểu thức lambda, và điều quan trọng là để cast biểu thức lambda vào một hành động
static main
{
Invoke((Action)(() => DoNothing())); // OK
Invoke(new Action(() => DoNothing())); // OK
Invoke(() => DoNothing()); // Doesn't compil
}
private static void Invoke(Delegate del) { }
Nhưng thật thú vị khi thấy trình biên dịch được ủy quyền này:
Action action =() => DoNothing();
Invoke(action);
Để chỉnh sửa của bạn: Điều gì có ý nghĩa nội dung sẽ có trong phương thức 'static'' Invoke' của bạn? –
Không có gì thú vị. Mục đích của câu hỏi là chỉ để hiểu sự khác biệt giữa 2 cú pháp. Thực hiện thực sự của tôi là trong một ứng dụng WPF khi tôi gọi Dispatcher.Invoke() (http://msdn.microsoft.com/en-us/library/cc647509(v=vs.100).aspx) – Hyralex
Tôi thấy. Bạn vẫn nên nhớ rằng 'Action' ___is___ a' Delegate', vì 'Action' xuất phát từ' Delegate'. Vì vậy, ngay cả khi bạn sử dụng một quá tải mà mất trong một 'đại biểu', bạn có thể cho nó một' hành động'. Ví dụ: 'Action bar =() => DoNothing (param); someDispatcher.BeginInvoke (bar); '(xem [' Dispatcher.BeginInvoke'] (http://msdn.microsoft.com/en-us/library/cc190824.aspx)). Ngoài ra: Trong một phiên bản mới hơn của khung công tác .NET 4.5, có quá tải 'Dispatcher.Invoke' lấy' Action', nhưng đó chỉ là để thuận tiện, xem http://msdn.microsoft.com/en-us/library /hh199416.aspx. –