博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]写给那些看不懂委托的同学
阅读量:5932 次
发布时间:2019-06-19

本文共 2394 字,大约阅读时间需要 7 分钟。

原文地址:

C# 从1.x 发展到目前的 4.5,委托的写法真是越来越简单精悍。如果您对这些委托的写法不是很清晰,本文可以帮助到您。

委托是一种安全封装方法的类型,可以将方法作为方法的参数。

委派方法的参数个数、顺序、类型及方法返回值类型必须跟定义的委托方法一样,但参数名称可以不同

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
say1 = delegate(string Name) { return string.Format("Hello {0}", Name); }; //和Lambda 结合 Func
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
say1 = delegate(string Name) { Console.WriteLine(string.Format("Hello {0}", Name)); }; //和Lambda 结合 Action
say2 = (Name)=> { Console.WriteLine(string.Format("Hello {0}", Name)); }; say1("Action 委托"); say2("Action 委托"); Console.ReadKey();}

 输出结果:"Hello Action 委托"

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

转载于:https://www.cnblogs.com/wulincan/articles/2937928.html

你可能感兴趣的文章
ML 线性回归Linear Regression
查看>>
oracle如何用sql查看触发器?
查看>>
如何对HashMap按键值排序
查看>>
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm
查看>>
js/jquery/插件表单验证
查看>>
Bandwidth内存带宽測试工具
查看>>
为Node.js编写组件的几种方式
查看>>
(轉貼) Anders Hejlsberg談C#、Java和C++中的泛型 (.NET) (C#)
查看>>
30天敏捷结果(24):恢复你的精力
查看>>
JNI——访问数组
查看>>
Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
查看>>
全面理解Git
查看>>
JS敏感信息泄露:不容忽视的WEB漏洞
查看>>
让我们荡起双桨,Android 小船波浪动画
查看>>
ApacheCN 翻译活动进度公告 2019.2.18
查看>>
分布式memcached服务器代理magent安装配置(CentOS6.6)
查看>>
Create Volume 操作(Part III) - 每天5分钟玩转 OpenStack(52)
查看>>
Polar码引发舆论狂欢 5G标准远未定局
查看>>
KSImageNamed-Xcode-master
查看>>
memcache
查看>>