写给那些看不懂委托的同学
2013-02-27 14:03
239 查看
C# 从1.x 发展到目前的 4.5,委托的写法真是越来越简单精悍。如果您对这些委托的写法不是很清晰,本文可以帮助到您。
委托是一种安全封装方法的类型,可以将方法作为方法的参数。
委派方法的参数个数、顺序、类型及方法返回值类型必须跟定义的委托方法一样,但参数名称可以不同。
1、C# 定义一个完整委托:
输出结果:"Hello 委托"
2、C#2.0后出现了匿名方法,可以将委托方法省略掉,直接给委托传递一个匿名方法,当然也要去掉New这个动作。
输出结果:"Hello 匿名方法"
3、 聪明的人们总是想使用更少的代码达到相同的效果。因此C#3.0 之后出现了 Lambda表达式、Action委托、Func 委托
(1) Lambda表达式:匿名方法的升级版,可以简化匿名方法的写法。写法 (形参列表)=>{ 表达式 OR 函数体 }
输出结果:"Hello Lambda"
通过看上面的代码,能否将定义的委托 SayMessage 也去掉吗?当然可以,用 Func委托 或者 Action委托 就可以取代它!
(2)Func 委托:当我们封装一个具有返回值方法的时候就可以使用Func委托。
Func 委托一共有 15种重载,但总会有一个返回值,比如我们示例中用到的Func<T, TResult>委托就是其中之一。
Func<T, TResult>的作用就是 封装一个具有一个T类型参数并返回 TResult 类型值参数的方法。
如果封装方法没有有输入参数则直接使用Func<TResult> 委托。
输出结果:"Hello Func 委托"
(3)Action委托:当我们封装一个没有返回参数的方法时,就可以使用Action委托。
Action委托也有 15种重载,封装的方法可有有输入参数,但不会有返回参数。
比如下面示例代码中用到的Action<T>委托,其作用就是 封装一个具有T类型参数且无返回值参数 的方法。
如果封装方法没有输入参数则可以直接使用 Action 委托。
输出结果:"Hello Action 委托"
委托是一种安全封装方法的类型,可以将方法作为方法的参数。
委派方法的参数个数、顺序、类型及方法返回值类型必须跟定义的委托方法一样,但参数名称可以不同。
1、C# 定义一个完整委托:
delegate string SayMessage(string msg); static string SayHello(string Name) { return string.Format("Hello {0}", Name); } static void Main(string[] args) { SayMessage say = new SayMessage(SayHello); Console.WriteLine(say("委托")); Console.ReadKey(); }
输出结果:"Hello 委托"
2、C#2.0后出现了匿名方法,可以将委托方法省略掉,直接给委托传递一个匿名方法,当然也要去掉New这个动作。
delegate string SayMessage(string msg); static void Main(string[] args) { SayMessage say = delegate(string Name) { return string.Format("Hello {0}", Name); }; Console.WriteLine(say("匿名方法")); Console.ReadKey(); }
输出结果:"Hello 匿名方法"
3、 聪明的人们总是想使用更少的代码达到相同的效果。因此C#3.0 之后出现了 Lambda表达式、Action委托、Func 委托
(1) Lambda表达式:匿名方法的升级版,可以简化匿名方法的写法。写法 (形参列表)=>{ 表达式 OR 函数体 }
delegate string SayMessage(string msg); static void Main(string[] args) { SayMessage say = (Name) => { return string.Format("Hello {0}", Name); }; Console.WriteLine(say("Lambda")); Console.ReadKey(); }
输出结果:"Hello Lambda"
通过看上面的代码,能否将定义的委托 SayMessage 也去掉吗?当然可以,用 Func委托 或者 Action委托 就可以取代它!
(2)Func 委托:当我们封装一个具有返回值方法的时候就可以使用Func委托。
Func 委托一共有 15种重载,但总会有一个返回值,比如我们示例中用到的Func<T, TResult>委托就是其中之一。
Func<T, TResult>的作用就是 封装一个具有一个T类型参数并返回 TResult 类型值参数的方法。
如果封装方法没有有输入参数则直接使用Func<TResult> 委托。
static void Main(string[] args) { Func<string, string> say1 = delegate(string Name) { return string.Format("Hello {0}", Name); }; //和Lambda 结合 Func<string, string> say2 = (Name) => { return string.Format("Hello {0}", Name); }; Console.WriteLine(say1("Func 委托")); Console.WriteLine(say2("Func 委托")); Console.ReadKey(); }
输出结果:"Hello Func 委托"
(3)Action委托:当我们封装一个没有返回参数的方法时,就可以使用Action委托。
Action委托也有 15种重载,封装的方法可有有输入参数,但不会有返回参数。
比如下面示例代码中用到的Action<T>委托,其作用就是 封装一个具有T类型参数且无返回值参数 的方法。
如果封装方法没有输入参数则可以直接使用 Action 委托。
static void Main(string[] args) { Action<string> say1 = delegate(string Name) { Console.WriteLine(string.Format("Hello {0}", Name)); }; //和Lambda 结合 Action<string> say2 = (Name)=> { Console.WriteLine(string.Format("Hello {0}", Name)); }; say1("Action 委托"); say2("Action 委托"); Console.ReadKey(); }
输出结果:"Hello Action 委托"
相关文章推荐
- 写给那些看不懂委托的同学
- 写给那些看不懂委托的同学
- 写给那些看不懂委托的同学(转载)
- 写给那些看不懂委托的同学
- 又是一年毕业季--写给那些不是985、211院校的同学
- 博客开通周年纪念 - 写给我自己和那些懂得坚持的同学~
- 我们的那些故事(写给1990—1993年出生的同学,请耐心看完,还行)
- 我们的那些故事(写给1987—1990年出生的同学,希望您能够看看)
- 写给那些浮躁的程序员
- HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
- 写给那些进步缓慢却全然不知的IT人
- 共勉:写给那些正奔三的80后
- 黑马程序员--写给各位同学,并致黑马各位老师的一封感谢信~~~~绝对给力
- 写给要考c++的同学
- 我的助理辞职了,写给那些刚毕业的年轻人
- [转] 写给那些正奔三的80后
- 写给那些对破解有偏执的人
- 写给那些表面笑嘻嘻的人
- 写给换工作和找工作的同学