委托 C#

  这些就是本身的理解.ide

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

1委托的使用更类差很少,也 是须要先定义再实例化.编译器

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

3多播委托it

4.匿名方法io

5Lambda表达式编译

6访问外部变量class

 

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

固然匿名方法也能够访问

相关文章
相关标签/搜索