面試的時候估計都會被問過,什麼是委托,事件是不是一種委托?委托的優點都是什麼?我在項目中經常使用,但是平時不註意整理概念性知識,回答起來像是囫圇吞棗,答不出個所以然來。今天周末抽出來一些時間,靜下心來整理下。下麵我將採用一問一答的性質來整理和記錄。 1.什麼是委托? 委托是一種類型安全的對象,它是指 ...
面試的時候估計都會被問過,什麼是委托,事件是不是一種委托?委托的優點都是什麼?我在項目中經常使用,但是平時不註意整理概念性知識,回答起來像是囫圇吞棗,答不出個所以然來。今天周末抽出來一些時間,靜下心來整理下。下麵我將採用一問一答的性質來整理和記錄。
1.什麼是委托?
委托是一種類型安全的對象,它是指向程式中的以後會被調用的函數方法(可以是多個)。
2.事件是不是一種委托?
是,是一種特殊的委托。
3.委托怎麼創建?
1 // 委托類型包含三個主要信息: 2 // 1.它所調用的方法名稱。 3 // 2.調用方法的參數(可選)。 4 // 3.該方法的返回類型(可選)。 5 public delegate string Texts(int x, int y);
4.委托的性質分為幾種?
委托性質分為兩種,分別是非同步委托,同步委托。
5.創建委托後,程式運行的時候發生了什麼?
編譯器處理委托對象時候,會自動產生一個派生自System.MulticastDelegate的密封類,它和它的基類System.Delegate。一起為委托提供必要的基礎設施。
通過ildasm.exe我們查看剛纔創建的Texts委托,發現它定義了3個公共方法。
1 public string Invoke(int x, int y); 2 public IAsyncResult BeginInvoke(int x, int y, AsynCallback cb, object state); 3 public int EndInvoke(IAsyncResult result);
可以看出BeginInvoke用於非同步調用。
6.能不能寫一個實戰的例子?
1 class Program 2 { 3 //聲明一個委托,這個委托可以指向任何傳入兩個int類型參數,並返回int類型的方法 4 public delegate int Texts(int x, int y); 5 public class SimpleMath 6 { 7 public static int Add(int x, int y) 8 { 9 return x + y; 10 } 11 public static int Subtract(int x, int y) 12 { 13 return x - y; 14 } 15 16 } 17 static void Main(string[] args) 18 { 19 //創建一個指向SimpleMath類中Add方法的對象 20 Texts t = new Texts(SimpleMath.Add); 21 22 //使用委托對象間接調用Add方法 23 Console.WriteLine("2+3={0}", t(2, 3)); 24 Console.ReadLine(); 25 26 } 27 }View Code
7.什麼是委托的多播。
委托的多播可以理解為,創建一個委托對象可以維護一個可調用方法的列表而不只是一個單獨方法。 直接上代碼可能更加直觀。
1 class Program 2 { 3 //聲明一個委托,這個委托可以指向任何傳入兩個int類型參數,並返回int類型的方法 4 public static int a = 0; 5 public delegate int Texts(int x, int y); 6 public class SimpleMath 7 { 8 public static int Add(int x, int y) 9 { 10 return a = x + y; 11 } 12 public static int Subtract(int x, int y) 13 { 14 return a = x + y + a; 15 } 16 17 } 18 static void Main(string[] args) 19 { 20 //創建一個指向SimpleMath類中Add方法的對象 21 Texts t = new Texts(SimpleMath.Add); 22 //委托的多播,可以直接使用+= 23 t += SimpleMath.Subtract; 24 t(2, 3); 25 //使用委托對象間接調用Add和Subtract方法 26 Console.WriteLine("a=" + a + ""); 27 Console.ReadLine(); 28 29 } 30 }View Code
8.有沒有快速創建委托的辦法?
我們可以使用Action<>和Func<>快速創建委托。
1 public static void TextAction(int x, int y) 2 { 3 Console.WriteLine("x=" + x + ",y=" + y + ""); 4 } 5 static void Main(string[] args) 6 { 7 8 //使用Action<>泛型委托快捷創建一個指向 TextAction 方法的委托。 (註意Action 只能指向沒有返回值的方法) 9 Action<int, int> action = new Action<int, int>(TextAction); 10 action(1, 2); 11 12 }View Code
1 public static int Textfun(int x, int y) 2 { 3 return x + y; 4 } 5 static void Main(string[] args) 6 { 7 8 //使用fun<>泛型委托快捷創建一個指向 Textfun 方法的委托。 (註意Func 最後一個參數值得是方法的返回值類型) 9 Func<int, int, int> fun = new Func<int, int, int>(Textfun); 10 Console.Write(fun.Invoke(2, 3)); 11 12 }View Code
暫時先整理這麼多,有哪塊錯誤或遺漏,歡迎大家指出和補充。