日期:2014-05-18  浏览次数:20767 次

请各位大侠指教C#中事件问题,小弟在线等!
using System;
public delegate void AgeChangeHandler(int age, object obj, ref bool b);

class Test
{
  //在C#中可以用事件触发器声明对象吗?
  public event AgeChangeHandler AgeChange;
  int iAge;

  public int Age
  {
  set
  {
  Boolean dontdoit = false;
  //这句话什么意思?
  AgeChange(value, this, ref dontdoit);
  if (!dontdoit)
  iAge = value;
  }
  get
  {
  return iAge;
  }
  }
  public Test()
  {
  iAge = 0;
  }
}

class Test1
{
  //这个函数是普通函数?
  private static void MyAgeChangeHandler(int age, Object obj, ref bool dontdoit)
{
Console.WriteLine("age{0},obj.age = {1}", age, ((Test)obj).Age);
if (age < 0 || age > 99)
dontdoit = true;
} public static void Main()
  {
  Test p = new Test();
  //为什么能用触发器new出对象,参数中给MyAgeChangeHandler什么意思?
  p.AgeChange += new AgeChangeHandler(MyAgeChangeHandler);
  p.Age = 21;
  p.Age = 33;

  Console.ReadLine();
  }
}

------解决方案--------------------
C#中的事件和委托关系密切问题,以你的code为例:
AgeChangeHandler是委托, AgeChange是事件,通过
p.AgeChange += new AgeChangeHandler(MyAgeChangeHandler); 
这里的new不是创建对象,可以理解为建立联系,将p对象AgeChange事件的处理要委托给类以外的方法MyAgeChangeHandler。




------解决方案--------------------
1、AgeChange(value, this, ref dontdoit); 
当委托与方法关联时,调用关联的方法(实际上是方法指针)
2、 private static void MyAgeChangeHandler(int age, Object obj, ref bool dontdoit) 

Console.WriteLine( "age{0},obj.age = {1} ", age, ((Test)obj).Age); 
if (age < 0 ¦ ¦ age > 99) 
dontdoit = true; 
}
就是一个普通方法;
3、 p.AgeChange += new AgeChangeHandler(MyAgeChangeHandler); 
p.AgeChange相当于是一个指针链表,此处表示把MyAgeChangeHandler方法指针添加到链表中去
------解决方案--------------------
AgeChangeHandler 是委托
AgeChange 是事件
MyAgeChangeHandler 是方法


Test1对象通过MyAgeChangeHandler方法将AgeChange事件委托给Test来处理

哈哈:)可以这样来解释吧:)