zoukankan      html  css  js  c++  java
  • 委托 C#

      这些就是自己的理解.

      委托的用处就是把方法传递给其他方法.

    1委托的使用更类差不多,也 是需要先定义再实例化.

    2Action<T>和Func<T>委托

    3多播委托

    4.匿名方法

    5Lambda表达式

    6访问外部变量

    1委托的使用更类差不多,也 是需要先定义再实例化.

    public class A
    {
    public string Aaa(string str)
    {
    return str;
    }
    }

    public partial class MainWindow : Window
    {
    private delegate string lianxidelegate(string str);--定义一个带一个参数的返回一个string类型的委托
    public MainWindow()
    {
    lianxidelegate l = new lianxidelegate(new A().Aaa);--实例化此委托
    MessageBox.Show(l("aaa"));--调用
    InitializeComponent();
    }
    }

    2Action<T>和Func<T>委托

    Action<T>表示引用一个void返回类型的方法,最多可以传递16种不同的参数类型

    Func<T> 表示引用能带返回类型值的方法

    public MainWindow()
    {
    Func<string,string> op=new A().Aaa;
    MessageBox.Show(op("a"));
    InitializeComponent();
    }

    3多播委托

    一个委托包含多个方法,这样的委托就是多播委托

    就比如刚才A类里面还有个方法Aaaa

    public MainWindow()
    {
    Func<string,string> op=new A().Aaa;
    op += new A().Aaaa;
    MessageBox.Show(op("a"));
    InitializeComponent();
    }

    多播委托可以识别+和+=,-和-=是删除方法调用.

    需要注意的是他调用两个方法,两个方法都返回值,最后的返回值是最后一个方法的.如果一个方法异常了,那下面的方法就不会执行了.这时候你就需要循环了.

    public class A
    {
    public string Aaa(string str)
    {
    return str;
    }
    public string Aaaa(string str)
    {
    return "dfsd";
    }
    public void No(string str)
    {
    MessageBox.Show(str);
    }
    public void No2(string str)
    {
    MessageBox.Show(str);
    }
    }

    public MainWindow()
    {
    Action<string> daaa=new A().No;
    daaa += new A().No2;
    Delegate[] deletates = daaa.GetInvocationList();
    foreach (var @delegate in deletates)
    {
    daaa("aaa");
    }
    InitializeComponent();
    }

    4.匿名方法

    public MainWindow()
    {
    Func<string, string> aaaaaa = delegate(string str)   //就是这块直接写,不用定义
    {
    return str;
    };
    MessageBox.Show(aaaaaa("aaaaaaa"));
    InitializeComponent();
    }

    不过匿名方法,编译器会自己定义一个方法,其实和不匿名是一样的,只是代码好看了,效率并没有提高.匿名方法用的时候不能使用跳转语句,不能跳出去,也不能跳进来.

    5Lambda表达式

    比匿名方法更好的一种方法就是用Lambda(只是个人喜好)

    public MainWindow()
    {
    Func<string, string> aaaaaa = canshu =>
    {
    return canshu;
    };
    MessageBox.Show(aaaaaa("aaaaaaa"));
    InitializeComponent();
    }

    多个参数就这么干就行

    Func<string,string,string> aaaaaa = (canshu1,canshu2)=>
    {
    return canshu1 + canshu2;
    };
    MessageBox.Show(aaaaaa("aaaaaaa","bbbbbbb"));

    6访问外部变量

    string cc = "cccc";
    Func<string,string,string> aaaaaa = (canshu1,canshu2)=>
    {
    return canshu1 + canshu2+cc;
    };
    MessageBox.Show(aaaaaa("aaaaaaa","bbbbbbb"));

    当然匿名方法也可以访问

  • 相关阅读:
    Delphi编程 -- 视频捕获avicap32.pas源代码
    Delphi的DataSource事件
    InfoPower4000 wwGrid控件的一些应用技巧
    TwwDBGrid + TwwDBLookupCombo 下拉列表
    Delphi中TwwDBLookupCombo中属性的简单设置
    DevExpress中文说明--TdxCameraControl Object 摄像头组件
    如何Windows分页控件中增加统计功能
    Kibana:运用索引模式的 formatter 来探索 IP 信息
    Alertmanager高可用
    Prometheus高可用部署
  • 原文地址:https://www.cnblogs.com/lijin/p/3454631.html
Copyright © 2011-2022 走看看