这些就是自己的理解.
委托的用处就是把方法传递给其他方法.
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();
}
不过匿名方法,编译器会自己定义一个方法,其实和不匿名是一样的,只是代码好看了,效率并没有提高.匿名方法用的时候不能使用跳转语句,不能跳出去,也不能跳进来.
比匿名方法更好的一种方法就是用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"));
当然匿名方法也可以访问