event有event的用法 慢慢体会

解决方案 »

  1.   

    怎么体会啊??要不要event,函数照样使用,没看到什么区别
      

  2.   

    delegate 委托
    event 事件
    事件是特殊的委托,是多播委托,可以添加多个事件处理函数,但是委托只能绑定一个处理函数。
      

  3.   

    本质上说,event是一个语法糖,它使得写程序更简单了。C#有大量的语法,你不用也一样写程序,甚至连循环语句都是不必要的——如果你只从是否必要的角度来看的话。
      

  4.   

    看清楚问题,行不?我说的是event关键字要和不要有什么区别?跟委托无关!!
      

  5.   

    public delegate void yin(int s);
    public event yin tuto;//有event定义
    另外一段代码给tuto赋值后, 运行函数tuto(5);public delegate void yin(int s);
    public yin tuto;//没有event定义
    另外一段代码给tuto赋值后, 运行函数tuto(5);运行没什么区别啊,这event到底有什么用??
      

  6.   

    你可以往事件上绑定多个处理函数,使用+=运算符,比如
    button.Click += button1_Click1;
    button.Click += button1_Click2;
    这样,多个处理函数都可以被调用。
    幕后,event的+=运算会被编译器转化成多播委托的合并操作(Delegate.Combine方法的调用,而你却不用操心这些)
      

  7.   

    C#语法糖有很多,比如using语句可以幕后去调用dispose方法,foreach会调用MoveNext Current等方法,自动属性会为你自动实现后备字段,yield return能做的更加神奇——甚至为你创建了匿名的迭代器类和多线程的枚举方法。
      

  8.   

    给个事件的例子using System.Windows.Forms;namespace 窗体间通信
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Form2 f2=new Form2();            f2.send += delegate(string text)
                {//订阅f2的事件send,并以匿名方法处理
                    textBoxForm1.Text = text;
                };
                f2.Show();
            }
        }
    }
    using System;
    using System.Windows.Forms;namespace 窗体间通信
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            public delegate void sendStr(string data);//委托类型声明
            public event sendStr send;//事件声明
            private void btnSend_Click(object sender, EventArgs e)
            {
                send(textBoxForm2.Text);//触发事件
            }
        }
    }
      

  9.   

    我大概知道楼主什么意思了
    你是说public yin tuto;//没有event定义 
    这样也是可以绑定事件...
    其实tuto这个时候不是一个事件,而是作为一个对象的实例,也就是说他是你定义的代理的一个实例.他的功能是
    代理的功能
      

  10.   

    你可以看看事件概述:
    http://msdn.microsoft.com/zh-cn/library/vstudio/awbftdfh.aspx类或对象可以通过事件向其他类或对象通知发生的相关事情事件具有以下特点:发行者确定何时引发事件,订户确定执行何种操作来响应该事件。一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件。没有订户的事件永远也不会引发。事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。 要异步调用事件,请参见使用异步方式调用同步方法。在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。你可以理解为一种通知或触发机制,
    想想窗体或控件的各种事件,
    都是达到某种条件而触发并执行绑定的方法
      

  11.   

    1.event这个关键字会把一般的委托转换为具有Add和Remove方法的持殊委托属性。
    2.event关键字,限定了外界对委托变量只能使用+=或-=操作符,从而限定外界的非法赋值和调用
    3.有event关键字标识的委托,一般情况下的返回值类型都是void(当前这非硬性规定)
      

  12.   

    参见http://blog.csdn.net/lulu_jiang/article/details/6451300
    event增加了限制,必须由事件触发委托方法
      

  13.   

    正巧啊。我刚才正学到这里。我和楼主有一样的疑问。感谢各位解答!我的想法是:委托的实例化(我这个表述也许不对,但你懂的)之后,事件能实现的功能,我委托也可以实现。
    也就是说,当有event关键字时,程序能运行正常。我把event去掉,程序也一样能运行正常。没错吧?event只不过是限制'委托实例对象'的能力用的,是委托的子集。
    如:事件只能进行+、-  不能直接Func(......)。而我取掉event之后,就可以直接用了。这样存在安全隐患我知道,但始终感觉为避开这点要绕这么多弯子?Event有啥明显优势,来让我心甘情愿给自己增加这么多麻烦?求说服!!我性格喜欢钻牛角尖,求业内高手闲暇之余给我解个惑啊!
      

  14.   

    再次看了一下别的文章,觉得event确实仅仅是用来限制触发条件的,只能用类里面的函数触发。
    不过也渐渐理解了为啥要搞这个名堂,就像一个Class,为啥要有public、protected、private,而不是统统的public?为了让机制在可控的情况下运行而不是将未知危险暴露在外。
    各位大神,我的理解正确否?
      

  15.   

    原来event是这么回事呀!学习了!以后可以考虑用用event了!
      

  16.   

    楼主给你终极答案 我也刚学刚研究清楚 楼上没有几个说对的 还都一副盛气凌人的样子C# in a nutshell 这本书讲的很清楚 我也是看了几遍才看到重点:
    event对象 在拥有该对象的类内部可以把它当成和delegate一样的东西
    只有在类外部使用这个event的时候才有所不同 只能使用它的+=和-=这两个运算符 不能使用任何方法去执行这个event的处理函数简单来说event关键字把delegate原本的invoke函数 和函数式的括号调用 都变成它的拥有类的私有函数 外部任何类都不能直接通过invoke或者括号传参等方式调用这个event的处理函数
    而delegate 无论它的拥有着还是其他任何类 都有全部的访问权限+= -=这些当然能用,直接invoke或者括号传参也能直接执行处理函数
      

  17.   


    delegate照样可以用+=绑定任意个函数 
    根本没说到点子上
      

  18.   

    都好会装逼啊
    你们说的都是event和普通delegate共有的性质 
    而楼主问的是event和普通delegate的区别
    牛头不对马嘴
    还一个劲炫耀语法糖这种词来装逼
    我要笑死  世风日下啊我去 还是和我学做菜吧亲 
      

  19.   

    都好会装逼啊
    你们说的都是event和普通delegate共有的性质 
    而楼主问的是event和普通delegate的区别
    牛头不对马嘴
    还一个劲炫耀语法糖这种词来装逼
    我要笑死  世风日下啊我去 还是和我学做菜吧亲 
    不要笑不笑的,人的认知能力是逐步的,有的时候可能只认识到一点,没认识到另一点,这有情可原。我看这样很好,大家互相讨论,说出自己的观点,就彼此都有了进步。所以,不要讽刺挖苦打击,没有谁生下来就什么都懂,就懂得彻底,彼此有个宽容心,好吧?
      

  20.   

    额我试过了,Event在对象外的操作只有“-=”,“+=”两种操作,其他的操作比如像delegate直接作为语句运行是不行的,必须在定义的类内部使用,说明Event同时具有public和private两种属性,在外部指向事件应该有的操作但是只能在内部处罚,这正好符合事件的特征,但是delegate就不一样,只要定义为public,类内部可以触发外部同样可以触发,它只是函数句柄而已,所以归纳起来Event是只有触发者才能调用运行的函数句柄,是特殊的delegate类型
      

  21.   

    都好会装逼啊
    你们说的都是event和普通delegate共有的性质 
    而楼主问的是event和普通delegate的区别
    牛头不对马嘴
    还一个劲炫耀语法糖这种词来装逼
    我要笑死  世风日下啊我去 还是和我学做菜吧亲 
    好像是用不用event的区别把。