C#委托实例

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

            }

        }
时间: 2024-10-16 23:35:50

C#委托实例的相关文章

C# 委托实例(跨窗体操作控件)

原文地址 http://blog.csdn.net/bdstjk/article/details/7004035 FORM1(一个名为“打开form2”的button控件) FORM2(一个名为“改变form1颜色“的button控件) 启动时,FORM1中点击button控件“打开form2””使FORM2显示出来. 点击FORM2中的“改变form1颜色”后,Form1中颜色改变. 完整代码 1 using System; 2 using System.Collections.Generic

C#创建委托实例

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyDelegate { class Program { static void Main(string[] args) { List<User> users = GetUsers(); //1.传统方式实例化委托实例 users = users.OrderBy(new Func<User, int

C# 委托实例(跨窗体操作控件)

在C#里面却是可以不用自定义消息这么复杂的方法来实现跨窗体调用控件,C#有更好的办法就是委托. 效果描述:有两个窗体,FORM1(一个名为“打开form2”的button控件)和FORM2(一个名为“改变form1颜色“的button控件).启动时,FORM1中点击button控件“打开form2””使FORM2显示出来.点击FORM2中的“改变form1颜色”后,Form1中颜色改变. 一.在Form2里面:       首先声明一个委托和委托实例Form2类外 public delegate

jQuery的事件委托实例分析

事件委托主要是利用事件冒泡现象来实现的,对于事件委托的精准的掌握,可以有利于提高代码的执行效率.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>脚本之家</title> <style type="text/css"> table{ width:300px; height:60px; backg

jQuery事件绑定和委托实例

本文实例讲述了jQuery事件绑定和委托.分享给大家供大家参考.具体方法如下: jQuery事件的绑定和委托可以用多种方法实现,on()  . bind()  . live()  . delegate() ,还有one(). 有时我们可能会像下面这样绑定一个事件: 复制代码代码如下: $("#div1").click(function() {      alert("点击后触发");  }); 上面的事件绑定,我们可以通过多种方式去实现: 1. on() 复制代码代

事件与委托实例

委托的语法和方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.string等等:而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中.首先来看看声明委托的语句:public deletate void MyDelegate(); public:访问修饰符 delegate:关键字 void:返回类型 M

[C#]委托实例分析

一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处. 1.C#中的事件和委托的作用? 事件代表一个组件能够被关注的一种信号,委托是可以把一个过程封装成变量进行传递并且执行的对象. 2.他们之间的关系? 委托是一种类型,事件是一种成员,就相当于public int Age {get;set;}这个属性中,int就是类型,Age是一个成员,public event EventHandler Push;这个事件中E

委托实例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托 { //随机数产生委托类型 delegate int DRandomBuilder(int min,int max); class CRandomBuilder { private Random rnd; public CRandomBuil

通过一个WPF实例进一步理解委托和事件

在前写过"浅谈C#中的委托"和"浅谈C#中的事件"两篇博客,内容有些抽象,似乎难以说明委托和事件的关系. 今天通过一个小程序来进一步说明二者的使用及联系. 首先新建一个WPF应用程序,取名TestDelegateAndEvent. 在.xmal中加入四个按钮,并添加Window_Loaded事件. 代码如下: <Window x:Class="TestDelegateAndEvent.MainWindow" xmlns="http