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"));

    当然匿名方法也可以访问

  • 相关阅读:
    TD在IE7不能浏览的问题解决办法
    SqlServer中的IsNull
    C#日期加减
    this._form为空或不是对象
    清除自动保存的远程机器登录密码
    解决下载文件名乱码问题的简单方法
    createTextRange选中测试表格
    GridView改变行的颜色(二)
    行列转换(1)
    .NET中调用系统程序
  • 原文地址:https://www.cnblogs.com/lijin/p/3454631.html
Copyright © 2011-2022 走看看