谁能告诉我C#中定义一个事件为什么需要一个委托啊
事件其实就是一个特殊的委托,对事件的声名其实就是声明一个私有的委托变量
你先把什么是委托搞清楚,就知道委托和事件的关系了
举个例子
public void EnglishGreeting(string name)
{
Console.WriteLine("Morning, "+ name);
}
public void ChineseGreeting(string name)
{
Console.WriteLine("早上好, "
+ name);
}
public enum Language
{
English, Chinese
}
public void GreetPeople(string name, Language lang)
{
//做某些额外的事情,比如初始化之类,此处略
switch (lang)
{
case Language.English:
EnglishGreeting(name);
break;
case Language.Chinese:
ChineseGreeting(name);
break
; }
这个语句当我们传入姓名name的参数,比如说"jack" 进去的时候将调用
EnglishGreeting方法,相反传name为“杰克"将调用ChineseGreeting方法
很显然这个语句的扩展性很差 ,如果再添加其他语言版的,那就得反复的去修改GreetPeople()方法,这个非常不方便
委托就可以解决上面的问题
public delegate void GreetingDelegate(string name);
在这里定义了委托,它代表方法的类型,这里代表EnglishGreeting和ChineseGreeting方法
static void Main(string[] args)
{
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
GreetPeople("Jimmy Zhang", delegate1);
Console.ReadKey();
}
也就是说此时委托代表EnglishGreeting 和ChineseGreeting 方法类,想当于他们的摸板(不知道楼主懂这句话不?)然后将这2个方法绑到此委托变量中,调用此变量的时候将依次执行上面的2个方法
这里输出结果为
Morning, Jimmy Zhang
早上好, Jimmy Zhang
早上好, 张子阳
到这里楼主明白了,委托的好处了吗??
事件顾名思义,就是发生的事情,一个事件中包含一些方法。那些方法都串联起来发生的的,即然如此肯定就和委托有关系,委托也是包含了一些方法,
先面看看看事件的声明方式
public event GreetingDelegate MakeGreet;
是吧?声明一个事件不过类似于声明一个委托类型的变量而已。
MakeGreet = EnglishGreeting;
MakeGreet += ChineseGreeting;
一样也是绑定方法,和委托一样
现在你应该明白为什么一个事件需要一个委托了把
事件其实就是委托,
不知道说了这多你明白了没
汗。。了
PS:事件和委托的关系是有点纠结,对于新手来说,过了这个坎儿,你就会觉得这个很简单,今天下午没事,花点时间举个例子来解答一下,不知道你明白了没
public event EventHandler Click这句话的event的理解,谢谢!c#问题,winform
event 是一个事件,在C#中事件是基于委托的,没有委托事件无法定义,event也是数据类型,微软的定义:类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
事件具有以下特点:
发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件。
没有订户的事件永远也不会引发。
事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。
如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。 要异步调用事件,请参见使用异步方式调用同步方法。
在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。
http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=vs.100)
public event EventHandler TextChanged; 然后再button_Click事件方法中加以下代码
建议楼主好好看下C#中的委托和事件,这个EventHandler 是一个委托,TextChanged是声明的一个事件,这个事件就是EventHandler 这个委托类型,
这样这个TextChanged就可以绑定与EventHandler 相同签名的方法了;
if(TextChanged!=null)
TextChanged(sender,e);
就是在按钮的button_Click单击事件中判断TextChanged上有没有绑定方法,
要是不判断的话直接调用这个事件,如果TextChanged上没有绑定方法就会报异常,所以之前判断有没有绑定方法
if(TextChanged!=null)说明这个事件绑定了方法,就可以去执行这个事件上的方法了!~~
这句代码是什么意思?public event PropertyChangedEventHandler PropertyChanged;
是事件委托。
所谓“事件委托”,一个事件的本质是一个委托(因为事件是委托类型的)。而委托的好处在于它可以动态调用不同类之间具备相同函数签名(函数参数顺序、类型、个数相同),且函数返回值必须完全相同的函数。我先举一个委托的例子:
namespace A
{
public delegate void Say(); //委托
class Dog
{
public void Say()
{
Console.WriteLine("汪汪!");
}
}
class Cat
{
public void Say()
{
Console.WriteLine("喵喵!");
}
}
public class MainTest
{
static void Main(string[] args)
{
Say s = new Say(new Dog().Say); //告诉委托调用Dog类中的Say方法
s += new Cat().Say; //同时告诉委托调用Cat类中的Say方法
s();
}
}
}
Dog和Cat类毫无联系,但是却可以通过委托连接起来关系,我们说委托具备“跨类调用”函数的特性。
因此,我们再来看一个事件的应用:
public class MyClass
{
public event EventHandler MyEvent = null; //EventHandler是一个系统委托,一般用于定义事件
………………
public void MyMethod() //这是一个引发事件的方法,一旦调用该方法,必然触发事件
{
………………
//引发一个事件!!
MyEvent(this,null);
}
}
主函数中:
MyClass mc = new MyClass();
mc.MyEvent+=new EventHandler(MyEvent_Raised);
………………
static void MyEvent_Raised(object sender, EventArgs e)
{
……………… //做你想做的事情
}
事件的实例化是在使用到包含这个事件的实体类时候(比如在主函数需要调用的时候)。通过+=进行实体化;然后当调用实体的MyMethod方法时候,这个方法将引发一个事件,也就是触发了绑定的MyEvent_Raised方法。
C# 用timer做成服务后 timer_Tick () 为什么不执行??
不能使用 窗体的 Timer,他只能在窗体中使用,服务中无法使用
请使用 System.Timers.Timer类
System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为1000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("ok");
}
如果控件是拖过来的,您可以在 窗体名.Designer.cs 这个文件中将 timer控件的命名空间改为 System.Timers