Nếu bạn muốn tạo đại biểu tùy chỉnh, bạn sẽ sử dụng từ khóa đại biểu bằng chữ thường.Đại biểu so với từ khóa đại biểu
Bạn có thể làm gì với Lớp đại biểu thực tế? Điều này tốt cho điều gì? Không hiểu sự khác biệt chính xác.
Nếu bạn muốn tạo đại biểu tùy chỉnh, bạn sẽ sử dụng từ khóa đại biểu bằng chữ thường.Đại biểu so với từ khóa đại biểu
Bạn có thể làm gì với Lớp đại biểu thực tế? Điều này tốt cho điều gì? Không hiểu sự khác biệt chính xác.
Từ http://msdn.microsoft.com/en-us/library/system.delegate.aspx:
Lớp
Delegate
là lớp cơ sở với nhiều loại đại biểu. Tuy nhiên, chỉ hệ thống và trình biên dịch mới có thể lấy được một cách rõ ràng từ lớpDelegate
hoặc từ lớpMulticastDelegate
. Nó cũng không được phép lấy loại loại mới từ loại đại biểu. Lớp họcDelegate
không được coi là loại đại biểu; nó là một lớp được sử dụng để lấy được các loại đại biểu.Hầu hết các ngôn ngữ thi hành một từ khóa
delegate
, và trình biên dịch cho những ngôn ngữ có thể bắt nguồn từ lớpMulticastDelegate
; do đó, người dùng nên sử dụng từ khóadelegate
do ngôn ngữ cung cấp.
Ưu điểm của lớp Delegate là lớp cơ sở cho tất cả các loại đại biểu trong .Net. Có một phương pháp mà có một thể hiện của lớp này cho phép bạn hoạt động chung trên tất cả các cách thức của các đại biểu. Đây là lý do hoạt động như ISynchronizedInvoke.Invoke sử dụng tham số này làm tham số.
Cần lưu ý, tuy nhiên, yêu cầu một đại biểu theo cách này bị trễ và chậm hơn (theo đó). –
Từ khóa đại biểu dành cho trình biên dịch thực hiện một số phép thuật cho bạn. Khi bạn khai báo một đại biểu mới với một chữ ký tùy chỉnh,
Vì vậy, bây giờ khi bạn gọi delObject(args)
- trình biên dịch chuyển đó để delObject.Invoke(args)
Lớp cơ sở đại biểu cung cấp một số chức năng như
Trình biên dịch C# cấm bạn bắt nguồn từ Đại biểu khám phá trong mã của bạn .. bạn phải sử dụng từ khóa đại biểu.
+1: Đặc biệt đề cập đến "trình biên dịch tạo một Loại mới cho bạn bắt nguồn từ MulticastDelegate" . Vì vậy, theo mặc định, các đại biểu chúng tôi tạo ra là tất cả các đại biểu Đa phương tiện – A9S6
Rõ ràng. Tôi thích câu trả lời của bạn. –
'trình biên dịch tạo ra một kiểu mới cho bạn có nguồn gốc từ MulticastDelegate' Tôi không chắc chắn về điều này. Theo http://msdn.microsoft.com/en-us/library/system.delegate.aspx 'Tuy nhiên, chỉ có hệ thống và trình biên dịch mới có thể lấy được từ lớp Delegate hoặc từ lớp MulticastDelegate.' Xin lưu ý từ khóa" ** hoặc ** " –
Từ phối cảnh triển khai, lớp Delegate xác định các trường được sử dụng để biểu diễn con trỏ hàm của đại biểu và lớp MultiCastDelegate cung cấp chức năng đường cơ sở được sử dụng bởi các sự kiện. Ngoài ra, như những người khác đã đề cập, Delegate cung cấp phương thức "DynamicInvoke" cho phép bạn gọi bất kỳ đại biểu nào.
Một điều gọn gàng, bạn có thể làm với delegate
từ khóa là tạo ra các đại biểu nội tuyến, mà không cần phải khai báo, ví dụ:
// constructor
public Form1()
{
this.Load += delegate(object sender, EventArgs e)
{
// Form1_Load code goes right here
}
}
Cú pháp lambda C# 3.0 ít chi tiết hơn nhiều. –
Một trong những điều các lớp Delegate
có thể được sử dụng cho là kiểm soát nhiều hơn khi gọi xử lý sự kiện. Ví dụ, với xử lý sự kiện bình thường, một ngoại lệ trong bất kỳ trình xử lý sự kiện nào sẽ ngăn chặn bất kỳ trình xử lý sự kiện nào sau này được gọi. Bạn có thể thay đổi hành vi đó bằng cách sử dụng lớp Delegate
để gọi thủ công từng trình xử lý sự kiện.
using System;
namespace DelegateClass
{
class EventSource
{
public event EventHandler TheEvent;
internal void RaiseEvent1()
{
EventHandler handler = TheEvent;
if (handler != null)
handler(this, EventArgs.Empty);
}
internal void RaiseEvent2()
{
EventHandler handler = TheEvent;
if (handler == null)
return;
Delegate[] handlers = handler.GetInvocationList();
foreach (Delegate d in handlers)
{
object[] args = new object[] { this, EventArgs.Empty };
try
{
d.DynamicInvoke(args);
}
catch (Exception ex)
{
while (ex.InnerException != null)
ex = ex.InnerException;
Console.WriteLine(ex.Message);
}
}
}
}
class Program
{
static void Handler1(object sender, EventArgs e)
{
Console.WriteLine("Handler1");
}
static void Handler2(object sender, EventArgs e)
{
Console.WriteLine("Handler2");
throw new InvalidOperationException();
}
static void Handler3(object sender, EventArgs e)
{
Console.WriteLine("Handler3");
}
static void Main(string[] args)
{
EventSource source = new EventSource();
source.TheEvent += Handler1;
source.TheEvent += Handler2;
source.TheEvent += Handler3;
try
{
source.RaiseEvent1();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("-------------------");
source.RaiseEvent2();
}
}
}
Tìm nạp tốt từ MSDN;) – Xian
http://msdn.microsoft.com/en-us/library/system.delegate.aspx – Xian