d DoSomething(string name ,Func<int> whatTime) //Func<int> 等价于委托 delegate int DoSomething();
{
var hour = whatTime.Invoke();
switch (hour)
{
case 5: Console.WriteLine($"{name}该起床");
break;
case 7: Console.WriteLine($"{name}出门");
break;
case 12:
Console.WriteLine($"{name}吃午饭");
break;
default:
Console.WriteLine($"{name}不知道该干什么了。");
break;
}
}
6.多播委托 :一个含有多个方法的委托
6.1:不要依赖于为委托增加方法时的顺序,虽然有时看起来一致。
6.2 : 多播委托中只能存储同一类型的委托.
class Program
{
//声明一个委托
internal delegate void DoSomething();
static void Main(string[] args)
{
//创建一个委托实例,并将符合委托签名的方法赋给它
DoSomething onEvening = LearningEnglish;
//多播委托:为一个委托实例赋予多个方法
onEvening += WatchTV;
onEvening += PlayGames;
//调用需要使用到委托的方法,并将委托实例传给对应的参数
DoSomethingBeforeSleep("Chris", onEvening);
Console.ReadKey();
}
//定义一个符合委托类型DoSomething签名的方法
static void LearningEnglish()
{
Console.WriteLine("背会单词吧。");
}
static void WatchTV()
{
Console.WriteLine("看会电视吧。");
}
static void PlayGames()
{
Console.WriteLine("玩会游戏吧。");
}
//需要用到委托的方法
static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
{
Console.WriteLine("睡前做点什么呢?");
doSomething.Invoke(); //等价于 doSomething();
Console.WriteLine($"{name}:我要睡觉了。");
}
6.3 可以通过调用GetInvocationList()方法, 返回当前委托中的所有方法的返回值.
Delegate [] delegate = onEvening.GetInvocationList();
6.4 多次为同一个委托对象赋值时,后者会覆盖前者。
DoSomething onEvening = LearningEnglish;
onEvening = WatchTV; //覆盖LearningEnglish 方法
onEvening = PlayGames; //覆盖 WatchTV 方法
6.5 多播委托中,如果其中某个方法执行时发生异常,则后续的方法不再执行.
class Program
{
//声明一个委托
internal delegate void DoSomething();
static void Main(string[] args)
{
//创建一个委托实例,并将符合委托签名的方法赋给它
DoSomething onEvening = LearningEnglish;
onEvening = WatchTV; //覆盖LearningEnglish 方法
onEvening = PlayGames; //覆盖 WatchTV 方法
//调用需要使用到委托的方法,并将委托实例传给对应的参数
DoSomethingBeforeSleep("Chris", onEvening);
Console.ReadKey();
}
//定义一个符合委托类型DoSomething签名的方法
static void LearningEnglish()
{
Console.WriteLine("背会单词吧。");
}
static void WatchTV()
{
Console.WriteLine("看会电视吧。");
throw new Exception("这里出了一个BUG");
}
static void PlayGames()
{
Console.WriteLine("玩会游戏吧。");
}
//需要用到委托的方法
static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
{
Console.WriteLine("睡前做点什么呢?");
doSomething.Invoke(); //等价于 doSomething();
Console.WriteLine($"{name}:我要睡觉了。");
}
}
7. 委托中的协变、逆变、闭包
7.1 闭包:通过Lambda表达式访问Lambda表达式块外的变量,这称之为闭包,闭包是一个非常好的功能,但如果使用不当,也会非常危险。(引自 C#高级编程 8.3.3)
static void Main(string[] args)
{
int someva l = 5;
Func<int, int> f = x => x + someva l;
Console.WriteLine(f(3));
someva l = 7;
Console.WriteLine(f(3));
Console.ReadKey();
}
本篇博客参考:《C#高级编程》、《C#本质论》、《MDSN》、http://www.cnblogs.com/DeepLearing/p/4594518.html
|