找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 780|回复: 9

[翻译文档] C#的事务 处置 和自界说 事务

[复制链接]

该用户从未签到

2

主题

37

帖子

6

积分

LV.1

Rank: 1

积分
6
QQ
发表于 2016-5-31 13:33:31 | 显示全部楼层 |阅读模式
一、懂得C#中的预界说事务处置机制

    在写代码前我们先来熟习.net框架中和事务有关的类和委托,懂得C#中预界说事务的处置。

    EventARgs是包括事务数据的类的基类,用于传递事务的细节。

    EventHandler是一个委托声明如下

         publicdelegate void EventHandler( object sender, EventArgs e )

    留意这里的参数,前者是一个对象(实在这里传递的是对象的引用,假如是button1的click事务则sender就是button1),后面是包括事务数据的类的基类。

    下面我们研讨一下Button类看看此中的事务声明(应用WinCV东西查看),以Click事务为例。

         publicevent EventHandler Click;

    这里界说了一个EventHandler类型的事务Click

    前面的内容都是C#在类库中已经为我们界说好了的。下面我们来看编程时发生的代码。

        privatevoid button1_Click(object sender, System.EventArgs e)
        {
            ...
        }

    这是我们和button1_click事务所对应的方式。留意方式的参数合适委托中的签名(既参数列表)。那我们怎么把这个方式和事务接洽起来呢,请看下面的代码。

        this.button1.Click+= new System.EventHandler(this.button1_Click);

    把this.button1_Click方式绑定到this.button1.Click事务。

    下面我们研讨一下C#事务处置的工作流程,起首体系会在为我们创立一个在后台监听事务的对象(假如是button1的事务那么监听事务的就是button1),这个对象用来发生事务,假如有某个用户事务产生则发生对应的利用法式事务,然后履行订阅了事务 的所有方式。

二、简略的自界说事务(1)

    起首我们须要界说一个类来监听客户端事务,这里我们监听键盘的输进。

    界说一个委托。

        publicdelegate void UserRequest(object sender,EventArgs e);

    前面的object用来传递事务的产生者,后面的EventArgs用来传递事务的细节,此刻临时没什么用途,一会后面的例子中将应用。

    下面界说一个此委托类型类型的事务

        publicevent UserRequest OnUserRequest;

    下面我们来做一个逝世轮回

        public void Run()
      {
      bool finished=false;
      do
      {
       if (Console.ReadLine()=="h")
       {
        OnUserRequest(this,new EventArgs());
       }  
      }while(!finished);
      }
    此代码不竭的请求用户输进字符,假如输进的成果是h,则触发OnUserRequest事务,事务的触发者是自己(this),事务细节无(没有传递任何参数的EventArgs实例)。我们给这个类取名为UserInputMonitor。

   下面我们要做的是界说客户真个类
    起首得实例化UserInputMonitor类
       UserInputMonitormonitor=new UserInputMonitor();

    然后我们界说一个方式。

      private void ShowMessage(object sender,EventArgs e)
      {
          Console.WriteLine("HaHa!!");
      }

     最后要做的是把这个方式和事务接洽起来(订阅事务),我们把它写到库户端类的结构函数里。

    Client(UserInputMonitor m)
     {
      m.OnUserRequest+=newUserInputMonitor.UserRequest(this.ShowMessage);
      //m.OnUserRequest+=newm.UserRequest(this.ShowMessage);

      //留意这种写法是过错的,由于委托是静态的

     }

     下面创立客户真个实例。

        new Client(monitor);

     对了,别忘了让monitor开端监听事务。

        monitor.run();

     年夜功乐成,代码如下:

  1. using System;

  2. class UserInputMonitor

  3. {

  4. public delegate void UserRequest(object sender,EventArgs e);

  5. //界说
    委托

  6. public event UserRequest OnUserRequest;

  7. //此委托类型类型的事务


  8. public void Run()

  9. {

  10.   bool finished=false;

  11.   do

  12.   {

  13.    if (Console.ReadLine()=="h")

  14.    {

  15.     OnUserRequest(this,new EventArgs());

  16.    }  

  17.   }while(!finished);

  18. }

  19. }

  20.    

  21. public class Client

  22. {

  23. public static void Main()

  24. {

  25.   UserInputMonitor monitor=new UserInputMonitor();

  26.   new Client(monitor);

  27.   monitor.Run();

  28. }

  29. private void ShowMessage(object sender,EventArgs e)

  30. {

  31.   Console.WriteLine("HaHa!!");

  32. }

  33. Client(UserInputMonitor m)

  34. {

  35.   m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);

  36.   //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);

  37.   //留意
    这种写法是过错
    的,由于
    委托是静态的

  38. }

  39. }

  40. 复制代码三、进一步研讨
    C#中的预界说
    事务
    处置
    机制    可能大师
    发明
    在C#中有些事务
    和前面的似乎不太一样。例如      private void textBox1_KeyPress(object sender,System.Windows.Forms.KeyPressEventArgs e)
  41.       {

  42.       }      this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);    这里应用
    了KeyPressEventArgs而不是EventArgs作为参数。这里应用
    了KeyEventHandler委托,而不是EventHandler委托。    KeyPressEventArgs是EventArgs的派生类,而KeyEventHandler的声明如下      publicdelegate void KeyEventHandler( object sender, KeyEventArgse );    是参数为KeyEventArgs的委托。那为什么KeyPress事务
    要这么做呢,我们可以从两个类的结构
    函数来找谜底
    。      public EventArgs();       public KeyPressEventArgs(char keyChar);    这里的keyData是什么,是用来传递我们按下了哪个键的,哈。    我在KeyEventArgs中又发明
    了属性       publicchar KeyChar { get; }    进一步证实
    了我的理论。下面我们来做一个相似
    的例子来辅助
    懂得
    。四、简略
    的自界说
    事务
    (2)    拿我们上面做的例子来改。
  43.     我们也界说
    一个EventArgs(相似
    KeyEventArgs)取名MyEventArgs,界说
    一个结构
    函数publicMyEventArgs(char keyChar),同样我们也设置响应
    的属性。代码如下
  44. using System;

  45. class MyMyEventArgs:EventArgs

  46. {

  47. private char keyChar;

  48. public MyMyEventArgs(char keyChar)

  49. {

  50.   this.keychar=keychar;

  51. }

  52. public char KeyChar

  53. {

  54.   get

  55.   {

  56.    return keyChar;

  57.   }

  58. }

  59. }

  60. 复制代码由于
    此刻
    要监听多个键了,我们得改写监听器的类中的do...while部门
    。改写委托,改写客户端传递的参数。好了终极
    代码如下,好累
  61. using System;

  62. class MyEventArgs:EventArgs

  63. {

  64. private char keyChar;

  65. public MyEventArgs(char keyChar)

  66. {

  67.   this.keyChar=keyChar;

  68. }

  69. public char KeyChar

  70. {

  71.   get

  72.   {

  73.    return keyChar;

  74.   }

  75. }

  76. }

  77.   

  78. class UserInputMonitor

  79. {

  80. public delegate void UserRequest(object sender,MyEventArgs e);

  81. //界说
    委托

  82. public event UserRequest OnUserRequest;

  83. //此委托类型类型的事务


  84. public void Run()

  85. {

  86.   bool finished=false;

  87.   do

  88.   {

  89.    string inputString= Console.ReadLine();

  90.    if (inputString!="")

  91.     OnUserRequest(this,new MyEventArgs(inputString[0]));

  92.   }while(!finished);

  93. }

  94. }



  95.   

  96. public class Client

  97. {

  98. public static void Main()

  99. {

  100.   UserInputMonitor monitor=new UserInputMonitor();

  101.   new Client(monitor);

  102.   monitor.Run();

  103. }

  104. private void ShowMessage(object sender,MyEventArgs e)

  105. {

  106.   Console.WriteLine("捕获
    到:{0}",e.KeyChar);

  107. }

  108. Client(UserInputMonitor m)

  109. {

  110.   m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);

  111.   //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);

  112.   //留意
    这种写法是过错
    的,由于
    委托是静态的

  113. }

  114. }

  115. 复制代码
复制代码

该用户从未签到

1

主题

24

帖子

3

积分

LV.1

Rank: 1

积分
3
发表于 2016-7-24 13:18:55 | 显示全部楼层
看帖怎么能不会呢??

该用户从未签到

2

主题

16

帖子

6

积分

LV.1

Rank: 1

积分
6
QQ
发表于 2016-7-24 13:18:56 | 显示全部楼层
嗯,很不错的样子!!

该用户从未签到

1

主题

20

帖子

8

积分

LV.1

Rank: 1

积分
8
QQ
发表于 2016-9-9 21:41:18 | 显示全部楼层
这里竟然还有这么一个关于AR的网站的收藏了

该用户从未签到

2

主题

7

帖子

9

积分

LV.1

Rank: 1

积分
9
QQ
发表于 2016-9-10 11:01:26 | 显示全部楼层
楼主写的很不错,关于AR的知识受教了

该用户从未签到

1

主题

7

帖子

5

积分

LV.1

Rank: 1

积分
5
QQ
发表于 2016-10-14 12:20:30 | 显示全部楼层
想了解下AR增强现实的相关内容来看看

该用户从未签到

1

主题

8

帖子

3

积分

LV.1

Rank: 1

积分
3
QQ
发表于 2016-10-20 07:32:15 | 显示全部楼层
楼主辛苦了。。回帖是一种美德

该用户从未签到

1

主题

5

帖子

3

积分

LV.1

Rank: 1

积分
3
QQ
发表于 2017-9-24 10:19:47 | 显示全部楼层
增强现实,增强现实,增强现实。重要的事情说三遍

该用户从未签到

0

主题

12

帖子

0

积分

LV.1

Rank: 1

积分
0
QQ
发表于 2017-10-11 16:43:43 | 显示全部楼层
竟然还有零回复,给我消失

该用户从未签到

1

主题

34

帖子

3

积分

LV.1

Rank: 1

积分
3
QQ
发表于 2017-11-29 17:55:38 | 显示全部楼层
楼主辛苦了,帮楼主顶起来
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表