zoukankan      html  css  js  c++  java
  • C#事件浅淡(1)

    最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子。

    原则

    1,定义一个事件信息类(标准的都继承EventArgs)

    2、定义一个委托(标准的是EventHandler结尾),可以写在命名空间里,类里都行,区别自己查

    3、就是定义一个此委托下的一个事件了。

    4、事件调用方法(也就是何种情况下调用这个事件,一般都叫On方法,多以On开头)

    5、用户处理方法,(一般这个不在事件类里面)

    1和2可以没有,下一文章再讲,这里讲一个完整的流程

    (1)、定义消息类

     1  public class PersonEventArgs : EventArgs
     2     {
     3 
     4         private int oldAge;
     5 
     6         public int OldAge
     7         {
     8             get { return oldAge; }
     9         }
    10         public PersonEventArgs(int age)
    11         {
    12             this.oldAge = age;
    13         }
    14 
    15     }

    (2,3,4)、定义事件类

     1  public delegate void PersonEventHandler(object sender, PersonEventArgs e);
     2     /// <summary>
     3     /// '************************************************
     4     /// //'◇作者:李阳阳
     5     /// //'◇小组:无
     6     /// //'◇说明:事件测试类
     7     /// //'◇版本号:V1.0.0
     8     /// //'◇创建日期:2016/5/10 8:04:51
     9     /// ///'*************************************************
    10     /// </summary>
    11     public class Person
    12     {
    13         public event PersonEventHandler AgeChanged;
    14 
    15         protected virtual void OnAgeChanged(PersonEventArgs e)
    16         {
    17             if (AgeChanged != null)
    18             {
    19                 AgeChanged(this, e);
    20             }
    21         }
    22 
    23         private string name;
    24         public string Name
    25         {
    26             get { return name; }
    27             set { name = value; }
    28         }
    29         private int age;
    30 
    31         public int Age
    32         {
    33             get { return age; }
    34             set
    35             {
    36                 if (age != value)
    37                 {
    38                     int orage = age;
    39                     age = value;
    40                     OnAgeChanged(new PersonEventArgs(orage));
    41                 }
    42             }
    43         }
    44 
    45         public void AddAge(int icrAge)
    46         {
    47             int orage = age;
    48             age += icrAge;
    49             OnAgeChanged(new PersonEventArgs(orage));
    50         }
    51 
    52         public override string ToString()
    53         {
    54             return string.Format("Name:{0}	 Age:{1}", name, age);
    55         }
    56         public Person()
    57         {
    58             name = "";
    59             age = 0;
    60         }
    61 
    62         public Person(string name, int age)
    63         {
    64             this.name = name;
    65             this.age = age;
    66             // author : lyy : 2016/5/10 8:14:36
    67             // last change : 
    68             /// 说明:  可以再这个地方添加一些预处理事件
    69             //   this.AgeChanged += new PersonEventHandler(Person_AgeChanged);
    70 
    71         }
    72 
    73         void Person_AgeChanged(object sender, PersonEventArgs e)
    74         {
    75             this.name = "我的名了没有变:" + name;
    76             //throw new NotImplementedException();
    77         }
    78     }

    (5)事件类的应用

     1  static void Main(string[] args)
     2         {
     3             Person p = new Person("sb", 24);
     4             Console.WriteLine(p.ToString());
     5             p.AgeChanged += new PersonEventHandler(p_AgeChanged);
     6             string a = Console.ReadLine();
     7             p.AddAge(int.Parse(a));
     8 
     9             Console.WriteLine(p.ToString());
    10             Console.Read();
    11         }
    12 
    13         static void p_AgeChanged(object sender, PersonEventArgs e)
    14         {
    15             Console.WriteLine("我手动修改了年龄");
    16             Person ptemp = sender as Person;
    17             // author : lyy : 2016/5/10 8:18:50
    18             // last change : 
    19             /// 说明: 为了看到效果我们在事件操作中再次更改年龄的值
    20             Console.WriteLine(string.Format("增加后的年龄{0}", ptemp.Age));
    21           
    22             Random rd = new Random(2);
    23 
    24             ptemp.Age = rd.Next(0,100);
    25             Console.WriteLine(string.Format("我在事件中又修改了年龄{0}",ptemp.Age));
    26          //   throw new NotImplementedException();
    27         }

    6,结果如图:

  • 相关阅读:
    详细解释ISupportInitialize接口
    微软发布了VS2005 IDE增强工具
    Oracle中无法解析TNS的陷阱
    Oracle临时表空间为何暴涨?
    欧洲游回来
    树比较的一个另类方法
    控件的Archor属性没有作用,是.Net的BUG?
    Oracle中取字段唯一值的一个sql语句的写法
    Qt程序的翻译
    Qt程序运行到Symbian手机上
  • 原文地址:https://www.cnblogs.com/ants_double/p/5476509.html
Copyright © 2011-2022 走看看