多播委托(Multicast Delegates)
// 定义委托
public delegate void MyDelegate(string message);
// 方法A
public static void MethodA(string message)
{
Console.WriteLine($"Method A: {message}");
}
// 方法B
public static void MethodB(string message)
{
Console.WriteLine($"Method B: {message}");
}
static void Main()
{
MyDelegate combinedDelegate = new MyDelegate(MethodA);
combinedDelegate += MethodB;
combinedDelegate.Invoke("Hello, World!");
// 输出:Method A: Hello, World!
// Method B: Hello, World!
combinedDelegate -= MethodB;
combinedDelegate.Invoke("Hello, World!");
// 输出:Method A: Hello, World!
Console.ReadKey();
}
例如还可以复杂一点
// 定义委托
public delegate void SayHello(string userName);
// 英文方法
private static void EnglishSay(string userName)
{
Console.WriteLine("Hello!" + userName);
}
// 中文方法
private static void ChineseSay(string userName)
{
Console.WriteLine("你好!" + userName);
}
// 将委托当参数传入另一个方法
private static void Say(string userName, SayHello say)
{
say(userName);
}
static void Main()
{
Say("小明", EnglishSay);
Say("小明", ChineseSay);
Console.ReadKey();
}
匿名方法
// 定义委托
public delegate void AnonymousDelegate(int number);
static void Main()
{
AnonymousDelegate anonymous = delegate (int num)
{
Console.WriteLine($"Square of {num}: {num * num}");
};
anonymous(5); // 输出:Square of 5: 25
Console.ReadKey();
}
Action用法
static void Main()
{
Action<string> lambda = message => Console.WriteLine($"From Lambda: {message}");
lambda("Hello from a lambda!"); // 输出:From Lambda: Hello from a lambda!
Console.ReadKey();
}
当然Action也可以传方法
// 定义一个方法给Action
private static void GetString(string name)
{
Console.WriteLine(name);
}
static void Main()
{
// Action有参无返回值(需定义方法并调用)
Action<string> stringAction = new Action<string>(GetString);
stringAction("小明");
// Action有参无返回值(匿名方法直接调用)
Action<string> string2Action = new Action<string>(ac =>
{
Console.WriteLine(ac);// ac等于调用传参的小萌
});
string2Action("小萌");
}
Func用法
static void Main()
{
Func<int, string> squareAndFormat = num => $"The square of {num} is {num * num}";
string result = squareAndFormat(7);
Console.WriteLine(result);// 输出:The square of 7 is 49
Console.ReadKey();
}
同样Func也可以传方法
// 定义一个方法给Func
public static bool IsNull(string text)
{
return string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text);
}
static void Main()
{
// Func有参有返回值(需定义方法并调用)
Func<string, bool> isNullFunc = new Func<string, bool>(IsNull);
Console.WriteLine(isNullFunc(""));
// Func有参有返回值(匿名方法直接调用)
Func<string, bool> isNull2Func = new Func<string, bool>(ac =>
{
return string.IsNullOrEmpty(ac) || string.IsNullOrWhiteSpace(ac);// ac等于调用传参的空字符串
});
Console.WriteLine(isNull2Func(""));
Console.ReadKey();
}
异步委托调用(BeginInvoke/EndInvoke)
// 定义委托
public delegate int LongRunningTaskDelegate();
static void Main()
{
// 休眠两秒返回固定值
LongRunningTaskDelegate task = () =>
{
Thread.Sleep(2000);
return 66;
};
Console.WriteLine("开始");
//IAsyncResult result = task.BeginInvoke(null, null);
var waroTask = Task.Run(()=> task.Invoke());
// 在这里执行其他任务...
Console.WriteLine("在这里执行其他任务");
//int returnValue = task.EndInvoke(result);
int returnValue = waroTask.Result;
Console.WriteLine($"Task returned: {returnValue}");
Console.ReadKey();
}
事件(Event)
// 定义事件和委托
public class StringEventArgs : EventArgs
{
public string Message { get; }
public StringEventArgs(string message)
{
Message = message;
}
}
public delegate void MessageEventHandler(object sender, StringEventArgs e);
// 引发事件
public class EventPublisher
{
// 定义事件
public event MessageEventHandler MessageReceived;
protected virtual void OnMessageReceived(StringEventArgs e)
{
MessageReceived?.Invoke(this, e);
}
public void SendMessage(string message)
{
var args = new StringEventArgs(message);
OnMessageReceived(args);
}
}
// 订阅和取消订阅事件
public class EventSubscriber
{
public void Subscribe(EventPublisher publisher)
{
publisher.MessageReceived += OnMessageReceived;
}
public void Unsubscribe(EventPublisher publisher)
{
publisher.MessageReceived -= OnMessageReceived;
}
private void OnMessageReceived(object sender, StringEventArgs e)
{
Console.WriteLine($"Subscriber received message: {e.Message}");
}
}
// 调用
static void Main()
{
var publisher = new EventPublisher();
var subscriber = new EventSubscriber();
subscriber.Subscribe(publisher);
publisher.SendMessage("Hello, world!");
subscriber.Unsubscribe(publisher);
publisher.SendMessage("Hello, world!");
Console.ReadKey();
}
这里调用了两次SendMessage,但是只有第一次会触发OnMessageReceived,第二次不会触发。