標籤:對比 內聯 dem 開始 bre obj tle gets 頁面
C# 委託執行個體 ,關鍵詞 :delegate
下面是微軟給出的官方解釋,自行感受一下, 本質就是把方法當作參數使用
delegate 是表示對具有特定參數列表和傳回型別的方法的引用的類型。 在執行個體化委託時,你可以將其執行個體與任何具有相容簽名和傳回型別的方法相關聯。 你可以通過委託執行個體調用方法。
委託用於將方法作為參數傳遞給其他方法。 事件處理常式就是通過委託調用的方法。 你可以建立一個自訂方法,當發生特定事件時,某個類(如 Windows 控制項)就可以調用你的方法。 下面的樣本示範了一個委託聲明:
public delegate int PerformCalculation(int x, int y);
可將任何可訪問類或結構中與委託類型匹配的任何方法分配給委託。 該方法可以是靜態方法,也可以是執行個體方法。 這樣便能通過編程方式來更改方法調用,還可以向現有類中插入新代碼。
注意
在方法重載的上下文中,方法的簽名不包括傳回值。 但在委託的上下文中,簽名包括傳回值。 換句話說,方法和委託必須具有相同的傳回型別。
將方法作為參數進行引用的能力使委託成為定義回調方法的理想選擇。 例如,對比較兩個對象的方法的引用可以作為參數傳遞到排序演算法中。 由於比較代碼在一個單獨的過程中,因此可通過更常見的方式編寫排序演算法。
委託概述
委託具有以下屬性:
委託類似於 C++ 函數指標,但它們是型別安全的。
委託允許將方法作為參數進行傳遞。
委託可用於定義回調方法。
委託可以連結在一起;例如,可以對一個事件調用多個方法。
方法不必與委託類型完全符合。 有關詳細資料,請參閱在委託中使用變體。
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數傳遞來代替單獨定義的方法。 C# 3.0 引入了 Lambda 運算式,利用它們可以更簡練地編寫內聯代碼塊。 匿名方法和 Lambda 運算式(在某些上下文中)都可編譯為委託類型。 這些功能現在統稱為匿名函數。 有關 lambda 運算式的更多資訊,請參見 匿名函數。
/// <summary> /// 載入頁面 /// </summary> /// <param name="sender"></param> /// <param name="e"></param private void BoardWindow_Loaded(object sender, RoutedEventArgs e) {Thread readThread = new Thread(new ThreadStart(delegate { BeginInput(); }));readThread.Start(); //開啟線程監測鍵盤} /// <summary> /// 接收鍵盤輸入資訊 /// </summary> private void ReciveInput(string message) { string num = ""; switch (message) { case "31": num = "1"; break; case "32": num = "2"; break; case "33": num = "3"; break; case "34": num = "4"; break; case "35": num = "5"; break; case "36": num = "6"; break; case "37": num = "7"; break; case "38": num = "8"; break; case "39": num = "9"; break; case "30": num = "0"; break; case "1B": num = "cancel"; break; case "08": num = "remove"; break; case "0D": num = "ok"; break; case "2E": num = "."; break; default: num = ""; break; } if (num == "") { return; } else if (num == "ok") { //AutoClosedMsgBox.Show("物理小鍵盤按了“確定”按鈕", "提示", 3000); Keyselect(); } else if (num == "remove") { //AutoClosedMsgBox.Show("物理小鍵盤按了“更正”按鈕", "提示", 3000); string code = ""; this.mathKeyBoard1.input.Dispatcher.Invoke(new Action(() => { code = this.mathKeyBoard1.input.Text; })); code = code.Substring(0, code.Length - 1); this.mathKeyBoard1.input.Dispatcher.Invoke(new Action(() => { this.mathKeyBoard1.input.Text = code; })); //Application.Current.Dispatcher.Invoke((Action)delegate //{ // qrcodemessage.Text = ""; //}); } else if (num == "cancel") { //AutoClosedMsgBox.Show("物理小鍵盤按了“cancel”按鈕", "提示", 3000); //this.mathKeyBoard1.input.Dispatcher.Invoke(new Action(() => { this.mathKeyBoard1.input.Text = ""; })); //BackHome(); KeyCancel(); return; } else { this.mathKeyBoard1.input.Dispatcher.Invoke(new Action(() => { this.mathKeyBoard1.input.Text += num; })); //Application.Current.Dispatcher.Invoke((Action)delegate { this.mathKeyBoard1.input.Text += num; }); } } ///<summary> /// 監測鍵盤,開始輸入按鍵 /// </summary> private void BeginInput() { //if (!Keystate) //{ // int k= NewAPI.OpenPort(jpProt, 9600); // if (k == 0) // { // Keystate = true; // AutoClosedMsgBox.Show("物理小鍵盤啟動成功,開始監測按鍵", "提示", 5000); // } // else // { // AutoClosedMsgBox.Show(string.Format("開啟鍵盤連接埠失敗,傳回值:{0}", k), "提示", 5000); // } //} //AutoClosedMsgBox.Show(string.Format("this.Visibility值:{0}", this.Visibility), "提示", 5000); while (true) { byte[] nowChar = new byte[2]; int status = NewAPI.ScoutKeyPress(nowChar); if (status == 0) { //AutoClosedMsgBox.Show(string.Format("按鍵明文監測成功,status:{0}", status), "提示", 2000); string strChar = System.Text.Encoding.Default.GetString(nowChar); if (nowChar[1] == 0) { //AutoClosedMsgBox.Show(string.Format("按鍵無值:{0}", nowChar[1]), "提示", 1000); continue; } else { //AutoClosedMsgBox.Show(string.Format("按鍵有值:{0}", nowChar[1]), "提示", 3000); ReciveInput(strChar); } } else { AutoClosedMsgBox.Show(string.Format("按鍵明文監測失敗,status:{0}", status), "提示", 3000); } } }
C#委託執行個體