1. 程式人生 > >C#委托實例

C#委托實例

安全 span 詳細信息 window 概述 處理程序 perf tle private

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#委托實例