using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication1
{
   delegate void CharEventHandler(object sender,CharEventArgs e);  //为事件定义一个代理
   
  
    public class  CharEventArgs : EventArgs            //创建一个包含事件信息的类
   {
     public char CurrChar;
     public CharEventArgs(char CurrChar)
     {
       this.CurrChar=CurrChar;
     }
   }   
    class CharChecker                 //创建一个包含事件成员的类
    {
        private char curr_char;
        public event CharEventHandler CharTest;  //定义事件成员
        public char Curr_Char          //创建触发事件的的方法或属性成员 
        {
            get
            {
                return curr_char;
            }
            set
            {
                if (CharTest != null)
                {
                    CharEventArgs myeven = new CharEventArgs(value);
                    curr_char = myeven.CurrChar;
                    CharTest(this, myeven);     //触发事件
                }
            }
        }
    }    
    
    class Program
    {
        
        
        static void Main(string[] args)
        {
            CharChecker chartester = new CharChecker();
            chartester.CharTest += new CharEventHandler(Change_X);  //关联事件处理方法和事件
            chartester.Curr_Char = 'a';
            Console.WriteLine("事件处理结果 :{0} ", chartester.Curr_Char);
            chartester.Curr_Char = 'b';
            Console.WriteLine ("事件处理结果 :{0} ",chartester.Curr_Char );
            chartester.Curr_Char = 'x';
            Console.WriteLine("{0}", chartester.Curr_Char);
            Console.WriteLine();        }
        static void Change_X (object source ,CharEventArgs e)
        {
            if (e.CurrChar == 'x')
            {
                Console.Write("触发的字母是 x ,");
                Console.Write("把 x 替换成 :");
                e.CurrChar = '?';
            }
            else
            {
                Console.Write("触发的字符不是 x,");
                e.CurrChar = 'c';
            }
        }
    }    
}运行结果:
触发的字符不是 x,事件处理结果 :b
触发的字符不是 x,事件处理结果 :a 
触发的字符不是 x,把 x 替换成 :x为什么:
e.CurrChar = '?';

e.CurrChar = 'c';
都没有执行呢?

解决方案 »

  1.   

    很明显,你在属性Curr_Char中设置值的时候                                    
    每次都CharEventArgs myeven = new CharEventArgs(value);
    也就是每次都 new 了一个,而且你的事件也都是set的时候才会触发.
      

  2.   

    结果是:触发的字符不是 x,事件处理结果 :a
    触发的字符不是 x,事件处理结果 :b
    触发的字母是 x ,把 x 替换成 :x请按任意键继续. . .这个和楼主写的可不一样..
      

  3.   

    e.CurrChar   =   '?'; 
    的时候并没有set CharChecker对象的Curr_Char属性
      

  4.   

    e.CurrChar = '?'; 这句话是执行了的,你可以单步调式看到
      

  5.   

    费了好大劲才看明白代码,LZ的期望结果是什么?你设置的时候明显是设置:e.CurrChar = '?';,e是什么?e是CharEventArgs myeven = new CharEventArgs(value);。OK,如果你认为你下面的Console.WriteLine("事件处理结果 :{0} ", chartester.Curr_Char);能够得到对e.CurrChar的修改。你却使用:chartester.Curr_Char,这个是什么? get{ return curr_char; }。
    即chartester.curr_char难道你认为这个chartester.curr_char和CharEventArgs.CurrChar 有什么关系?
      

  6.   

    curr_char = myeven.CurrChar;
    CharTest(this, myeven);     //触发事件
    顺序反了 应该触发事件后,再设置值吧
    char 是值类型