event有event的用法 慢慢体会
解决方案 »
- 生成对象时,编译不报错,但是生成的对象系统不识别,无法调用类方法
- SQL 多表查询
- listView的列表头Text如何换行显示,加\n不行呢
- InstallShield 10.5打包的软件,安装后,重新开机后经常又跳出软件继续安装的界面
- 有做过RTF的吗,有个插入图片的问题,请大虾帮忙
- 如何在listview中鼠标右键编辑数据
- 一个IDE的小问题~但是困扰了我一个晚上了
- 求解!
- 【模拟登陆网站】在窗体Form下WebBrowser1已实现自动登陆,Form2窗体如何复制Form下WebBrowser1已经通过验证的相同站点??
- C#里对自定义的颜色如“#ffffcc”的处理问题
- C#生成WORD单元格合并!
- 跪求asp.net mvc3 的小项目代码
event 事件
事件是特殊的委托,是多播委托,可以添加多个事件处理函数,但是委托只能绑定一个处理函数。
public event yin tuto;//有event定义
另外一段代码给tuto赋值后, 运行函数tuto(5);public delegate void yin(int s);
public yin tuto;//没有event定义
另外一段代码给tuto赋值后, 运行函数tuto(5);运行没什么区别啊,这event到底有什么用??
button.Click += button1_Click1;
button.Click += button1_Click2;
这样,多个处理函数都可以被调用。
幕后,event的+=运算会被编译器转化成多播委托的合并操作(Delegate.Combine方法的调用,而你却不用操心这些)
{
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);//触发事件
}
}
}
你是说public yin tuto;//没有event定义
这样也是可以绑定事件...
其实tuto这个时候不是一个事件,而是作为一个对象的实例,也就是说他是你定义的代理的一个实例.他的功能是
代理的功能
http://msdn.microsoft.com/zh-cn/library/vstudio/awbftdfh.aspx类或对象可以通过事件向其他类或对象通知发生的相关事情事件具有以下特点:发行者确定何时引发事件,订户确定执行何种操作来响应该事件。一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件。没有订户的事件永远也不会引发。事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。 要异步调用事件,请参见使用异步方式调用同步方法。在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。你可以理解为一种通知或触发机制,
想想窗体或控件的各种事件,
都是达到某种条件而触发并执行绑定的方法
2.event关键字,限定了外界对委托变量只能使用+=或-=操作符,从而限定外界的非法赋值和调用
3.有event关键字标识的委托,一般情况下的返回值类型都是void(当前这非硬性规定)
event增加了限制,必须由事件触发委托方法
也就是说,当有event关键字时,程序能运行正常。我把event去掉,程序也一样能运行正常。没错吧?event只不过是限制'委托实例对象'的能力用的,是委托的子集。
如:事件只能进行+、- 不能直接Func(......)。而我取掉event之后,就可以直接用了。这样存在安全隐患我知道,但始终感觉为避开这点要绕这么多弯子?Event有啥明显优势,来让我心甘情愿给自己增加这么多麻烦?求说服!!我性格喜欢钻牛角尖,求业内高手闲暇之余给我解个惑啊!
不过也渐渐理解了为啥要搞这个名堂,就像一个Class,为啥要有public、protected、private,而不是统统的public?为了让机制在可控的情况下运行而不是将未知危险暴露在外。
各位大神,我的理解正确否?
event对象 在拥有该对象的类内部可以把它当成和delegate一样的东西
只有在类外部使用这个event的时候才有所不同 只能使用它的+=和-=这两个运算符 不能使用任何方法去执行这个event的处理函数简单来说event关键字把delegate原本的invoke函数 和函数式的括号调用 都变成它的拥有类的私有函数 外部任何类都不能直接通过invoke或者括号传参等方式调用这个event的处理函数
而delegate 无论它的拥有着还是其他任何类 都有全部的访问权限+= -=这些当然能用,直接invoke或者括号传参也能直接执行处理函数
delegate照样可以用+=绑定任意个函数
根本没说到点子上
你们说的都是event和普通delegate共有的性质
而楼主问的是event和普通delegate的区别
牛头不对马嘴
还一个劲炫耀语法糖这种词来装逼
我要笑死 世风日下啊我去 还是和我学做菜吧亲
你们说的都是event和普通delegate共有的性质
而楼主问的是event和普通delegate的区别
牛头不对马嘴
还一个劲炫耀语法糖这种词来装逼
我要笑死 世风日下啊我去 还是和我学做菜吧亲
不要笑不笑的,人的认知能力是逐步的,有的时候可能只认识到一点,没认识到另一点,这有情可原。我看这样很好,大家互相讨论,说出自己的观点,就彼此都有了进步。所以,不要讽刺挖苦打击,没有谁生下来就什么都懂,就懂得彻底,彼此有个宽容心,好吧?
你们说的都是event和普通delegate共有的性质
而楼主问的是event和普通delegate的区别
牛头不对马嘴
还一个劲炫耀语法糖这种词来装逼
我要笑死 世风日下啊我去 还是和我学做菜吧亲
好像是用不用event的区别把。