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); } } }