這些就是本身的理解.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"));
固然匿名方法也能夠訪問