C Delegates 委托

C Delegates 委托C Delegates 委托通常我们都是把数据作为参数传递给方法 inti int Parse 99 当需要把方法传送给其他方法时就需要使用委托 类的用法 首先声明一个类 接着实例化一个类 委托的用法和类的用法类似 首先定义委托告诉编译器这种类型的委托表示哪种类型的方法 接着创建该委托的一个或者多个实例 声明委托委托的类型安全性非常高 在定义委托时必须给出他所表示的方法的签名

C# Delegates 委托

声明委托

根据定义委托的可见性和委托的作用域,可以在委托的定义上应用任意常见的访问修饰符:public,private,protected。

使用委托

namespace Delegates { 
    class Program { 
    // 声明委托 private delegate string GetString(); static void Main(string[] args) { 
    // 定义一个委托的实例getString GetString getString = null; int i = 99; // 给委托赋值 getString = i.ToString; Console.WriteLine($"{getString()}"); } } } 

在给委托赋值时,这个方法必须匹配委托声明时的签名,在调用时使用了类似方法的getString(),C#编译器会用getString.Invoke()代替getString()。

Action< T >和Func< T >委托

 class Program { 
    private delegate double DoubleOp(double x); static void Main(string[] args) { 
    DoubleOp[] operations = { 
    MathOpertions.MuliplyByTwo,MathOpertions.Squate}; for(int i = 0; i < operations.Length; i++) { 
    ProcessAndDisplayNumble(operations[i], 2.0); ProcessAndDisplayNumble(operations[i], 7.94); ProcessAndDisplayNumble(operations[i], 1.414); } Console.WriteLine($""); } static void ProcessAndDisplayNumble(DoubleOp action, double value) { 
    double result = action(value); Console.WriteLine($"value={value},operation result ={result}"); } } class MathOpertions { 
    public static double MuliplyByTwo(double value) => value * 2; public static double Squate(double value) => value * value; } 

上面列举了一个普通的委托实例,需要先声明一个委托,下面用Fun< double T , double T >修改上面的代码,不需要声明委托。

 static void Main(string[] args) { 
    Func<double,double>[] operations = { 
    MathOpertions.MuliplyByTwo,MathOpertions.Squate}; for(int i = 0; i < operations.Length; i++) { 
    ProcessAndDisplayNumble(operations[i], 2.0); ProcessAndDisplayNumble(operations[i], 7.94); ProcessAndDisplayNumble(operations[i], 1.414); } Console.WriteLine($""); } static void ProcessAndDisplayNumble(Func<double, double> action, double value) { 
    double result = action(value); Console.WriteLine($"value={value},{action.ToString()} result ={result}"); } } class MathOpertions { 
    public static double MuliplyByTwo(double value) => value * 2; public static double Squate(double value) => value * value; } 

多播委托

以上每个委托都只包含一个方法调用,调用委托的次数和调用 方法的次数相同。委托可以包含多个方法,如果调用多播委托,就会按照顺序连续调用多播委托中的方法。多播委托可以识别‘+’、‘+=’、‘-’、‘-=’。

 class Program { 
    static void Main(string[] args) { 
    Action<double> operations = null; operations = MathOpertions.MuliplyByTwo; operations += MathOpertions.Square; double[] arr = new double[]{ 
    2.0, 7.94, 1.414 }; foreach(var item in arr) { 
    operations(item); } Console.WriteLine($"Hello World"); } } class MathOpertions { 
    public static void MuliplyByTwo(double value) { 
    double result = value * 2; Console.WriteLine($"MuliplyByTwo value={value} reult={result}"); } public static void Square(double value) { 
    double result = value * 2; Console.WriteLine($"Square value={value} reult={result}"); } } 

多播委托顺序执行方法
使用多播委托会有一个问题:通过委托调用的其中一个方法抛出异常,整个迭代就会停止。如下代码所示,在方法中假装抛出异常:

 class Program { 
    static void Main(string[] args) { 
    Action<double> operations = null; operations = MathOpertions.MuliplyByTwo; operations += MathOpertions.Square; double[] arr = new double[]{ 
    2.0, 7.94, 1.414 }; foreach(var item in arr) { 
    operations(item); } Console.WriteLine($"Hello World"); } } class MathOpertions { 
    public static void MuliplyByTwo(double value) { 
    double result = value * 2; Console.WriteLine($"MuliplyByTwo value={value} reult={result}"); throw new Exception("this is a Exception"); } public static void Square(double value) { 
    double result = value * 2; Console.WriteLine($"Square value={value} reult={result}"); } } 

多播委托抛出异常终止迭代
解决这个问题:使用try…catch,抛出异常后循环继续

class Program { 
    static void Main(string[] args) { 
    Action<double> operations = null; operations = MathOpertions.MuliplyByTwo; operations += MathOpertions.Square; double[] arr = new double[]{ 
    2.0, 7.94, 1.414 }; foreach(var item in arr) { 
    try { 
    operations(item); }catch(Exception e) { 
    Console.WriteLine(e.Message); } } Console.WriteLine($"Hello World"); } } class MathOpertions { 
    public static void MuliplyByTwo(double value) { 
    double result = value * 2; Console.WriteLine($"MuliplyByTwo value={value} reult={result}"); throw new Exception("this is a Exception"); } public static void Square(double value) { 
    double result = value * 2; Console.WriteLine($"Square value={value} reult={result}"); } } 

多播委托抛出异常迭代继续
虽然循环继续,但是每次只执行第一个方法,因为第一个方法抛出异常后委托的迭代会停止。解决这个问题,需要自己迭代方法列表:

 class Program { 
    static void Main(string[] args) { 
    Action<double> operations = null; operations = MathOpertions.MuliplyByTwo; operations += MathOpertions.Square; Delegate[] delegates = operations.GetInvocationList(); double[] arr = new double[]{ 
    2.0, 7.94, 1.414 }; foreach(var item in arr) { 
    foreach(Action<double> d in delegates) { 
    try { 
    d(item); } catch (Exception e) { 
    Console.WriteLine(e.Message); } } } Console.WriteLine($"Hello World"); } } class MathOpertions { 
    public static void MuliplyByTwo(double value) { 
    double result = value * 2; Console.WriteLine($"MuliplyByTwo value={value} reult={result}"); throw new Exception("this is a Exception"); } public static void Square(double value) { 
    double result = value * 2; Console.WriteLine($"Square value={value} reult={result}"); } } 

委托内方法迭代

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232867.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎么同时运行两个tomcat?

    怎么同时运行两个tomcat?转载至:http://ask.zol.com.cn/x/4522378.html这几天由于在搞那个jenkins的自动部署项目所以要使用到两个tomcat(因为一个tomcat不能同时开着两个项目),一个作为jenkins服务器,一个作为项目部署服务器,所以找了一些资料看看一台电脑怎么运行两个tomcat。第一步:先下载两个tomcat(不同版本的也行,笔者用的是一个tomcat7,一个…

    2022年6月15日
    38
  • ORACLE触发器详解

    ORACLE触发器详解本文对原文做了格式和目录调整方便阅读。文章总结的很全面,感谢原作的辛勤付出!!!原文链接:http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html#!comments——————————————————————————–…

    2022年7月11日
    18
  • myeclipse下载地址_eclipse手机版

    myeclipse下载地址_eclipse手机版由于MyEclipse屏蔽了大陆ip,所以下载MyEclipse还是比较麻烦的,下面是MyEclipse7.5GA的各种版本的直接地址:1-MyEclipseEnterpriseWorkbench7.5forWindows98/2000/NT/XP/Vista(06/17/2009)MyEclipseEnterpriseWorkbench7.5GAforEc

    2022年9月25日
    4
  • certutil 导入 CA 证书

    certutil 导入 CA 证书

    2022年3月1日
    76
  • 客服系统源码购买_网联接入商户扣款

    客服系统源码购买_网联接入商户扣款介绍:客服系统多种商户接入客服源码,可以实现一行代码接入客服,非常舒服,支持无限客服,无限坐席!私有化源码部署,数据可控,稳定可靠。可自定义版权、logo。支持网页、微信公众号、小程序、App等任何程序对接。客服数量不限,每个客服又独立管理后台和账户密码。每个账户管理可以添加N个客服并且可以分组。双向微信模板消息通知。支持商品推送,对客服评价。支持客户分组。支持设置问候语,进入对话自动发送消息,可只能分配客服和转接。网盘下载地址:http://kekewl.cc/Evr7Jd0UX7h图

    2022年9月21日
    6
  • 求z=x-y的概率密度_X和Y独立同分布

    求z=x-y的概率密度_X和Y独立同分布Z=X+Y型概率密度的求解@(概率论)Z=g(X,Y)Z=g(X,Y)总结过一次,一般方法是可以由分布函数再求导得到概率密度,计算一定更要小心才能得到正确的解。FZ(z)=P(Z≤z)=P(g(X,Y)≤z)=∫∫g(x,y)≤zf(x,y)dxdyF_Z(z)=P(Z\leqz)=P(g(X,Y)\leqz)\\=\int\int_{g(x,y)\leqz}f(x,y)d

    2022年10月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号