当前位置:编程学习 > C#/ASP.NET >>

关于c#中事件的处理的问题(我是个菜鸟,而且菜的出水)

各位大侠,我知道在这里活跃的都是编程牛人,我是个初入编程的菜鸟,问的问题也很菜,可能让你回答的都感到厌烦,但是我真的很希望各位伸出援手,帮帮我。其实问题很简单(对我来说很难),只希望您能帮帮忙。我这里先跪拜了!

using System; 
using System.Text; 
namespace MyDelegate 

class Car 

//这个是定义委托,我比较明白,但是后面的参数(string msg)是什么意思呢,说事件的委托要有两个参数,但是string 和 msg 是两个参数 还是一个string类型的msg参数呢? 
public delegate void delegateCar(string msg); 
//这个是定义了事件,但后面定义的eventCar必须用delegateCar来定义嘛? 
public event delegateCar eventCar; 
//这个方法是做什么的? 
public void Stop() 

//还有这个说是来触发事件的,为什么这么用呢?eventCar("刹车!");就能触发事件?应该怎么理解呢? 
eventCar("刹车!"); 


//这个类用来做什么呢? 
class CarHandler 

//这个方法用来做什么呢?它的参数和声明的委托一样,这两个有联系嘛? 
public void HandlerEvent(string msg) 

//这里为何只输出一个msg参数呢,代表什么呢? 
Console.WriteLine(msg); 


class Program 

public static void Main(string[] args) 

Car car = new Car(); 
CarHandler handler = new CarHandler(); 
//这句是什么意思,说+=用来订阅事件的,我不太理解这个概念。希望把这句话详细的解释一下比如:+=用来做什么/Car.delegateCar用来做什么/Car.delegateCar用来做什么/ 
car.eventCar += new Car.delegateCar(handler.HandlerEvent); 
//这里为和调用stop() 
car.Stop(); 



上面是一段有关于“c#中事件处理”的代码(教科书上的),我不太理解,希望帮忙注释一下,越详细越好。还有问题就是我标注的地方不理解是怎么回事,能不能用通俗的话讲解一下。  --------------------编程问答--------------------

using System;
using System.Text;
namespace MyDelegate
{
class Car
{
//这个是定义委托,我比较明白,但是后面的参数(string msg)是什么意思呢,说事件的委托要有两个参数,但是string 和 msg 是两个参数 还是一个string类型的msg参数呢?
public delegate void delegateCar(string msg);
//这个是定义了事件,但后面定义的eventCar必须用delegateCar来定义嘛?
public event delegateCar eventCar;
//这个方法是做什么的?
public void Stop()
{
//还有这个说是来触发事件的,为什么这么用呢?eventCar("刹车!");就能触发事件?应该怎么理解呢?
eventCar("刹车!");
}
}
//这个类用来做什么呢?
class CarHandler
{
//这个方法用来做什么呢?它的参数和声明的委托一样,这两个有联系嘛?
public void HandlerEvent(string msg)
{
//这里为何只输出一个msg参数呢,代表什么呢?
Console.WriteLine(msg);
}
}
class Program
{
public static void Main(string[] args)
{
Car car = new Car();
CarHandler handler = new CarHandler();
//这句是什么意思,说+=用来订阅事件的,我不太理解这个概念。希望把这句话详细的解释一下比如:+=用来做什么/Car.delegateCar用来做什么/Car.delegateCar用来做什么/
car.eventCar += new Car.delegateCar(handler.HandlerEvent);
//这里为和调用stop()
car.Stop();
}
}



这样好看点 --------------------编程问答--------------------

using System; 
using System.Text; 
namespace MyDelegate 

class Car 

//这个是定义委托,我比较明白,但是后面的参数(string msg)是什么意思呢,说事件的委托要有两个参数,但是string 和 msg 是两个参数 还是一个string类型的msg参数呢? 
//是一个参数,即string类型的参数,参数名为msg
public delegate void delegateCar(string msg); 
//这个是定义了事件,但后面定义的eventCar必须用delegateCar来定义嘛?
//先定义委托,再定义事件
public event delegateCar eventCar;   //定义一个事件,类型是delegateCar类型的
//这个方法是做什么的?        //定义了Stop方法,此方法执行时出发事件eventCar
public void Stop() 

//还有这个说是来触发事件的,为什么这么用呢?eventCar("刹车!");就能触发事件?应该怎么理解呢?    //使用eventCar也可以啊
eventCar("刹车!"); 


//这个类用来做什么呢? 
class CarHandler 

//这个方法用来做什么呢?它的参数和声明的委托一样,这两个有联系嘛? 
public void HandlerEvent(string msg) 

//这里为何只输出一个msg参数呢,代表什么呢? 
Console.WriteLine(msg); 


class Program 

public static void Main(string[] args) 

Car car = new Car(); 
CarHandler handler = new CarHandler(); 
//这句是什么意思,说+=用来订阅事件的,我不太理解这个概念。希望把这句话详细的解释一下比如:+=用来做什么/Car.delegateCar用来做什么/Car.delegateCar用来做什么/ 
car.eventCar += new Car.delegateCar(handler.HandlerEvent);    //将car的eventCar事件中,附加上事件HandlerEvent
//这里为和调用stop()     //执行eventCar事件,否则看不到输出结果
car.Stop(); 



--------------------编程问答--------------------
using System;
using System.Text;
namespace MyDelegate
{
class Car
{
//所谓委托,你可以理解为函数指针,就是指向某个函数的指针(如果你学过c的话,应该可以理解)
//void delegateCar(string msg),void是返回类型,delegateCar是委托类型的名字,以后可以用它来创建委托,msg为参数,string是参数类型
public delegate void delegateCar(string msg);
//这个是定义了事件,但后面定义的eventCar必须用delegateCar来定义嘛?必须!委托定义了函数的参数、返回值,而事件什么都没有定义,所以事件必须依赖于委托的定义。如果把委托视作函数指针的话,delegateCar就是函数指针类型,eventCar就是函数指针类型的一个变量了,
public event delegateCar eventCar;
//这个方法是做什么的?Car的方法,表示要求汽车停下来。这里并没有实现如何让car停下来的,只是发出事件说car已经刹车了。
public void Stop()
{
//还有这个说是来触发事件的,为什么这么用呢?eventCar("刹车!");就能触发事件?应该怎么理解呢?
//前面已经说了,委托是函数指针,event是函数指针类型的变量,现在就是根据变量的值,找到相应的函数,并调用。
//另外,函数的调用,通常要判断:if(eventCar!=null),以防止函数指针变量未指向任何函数。
eventCar("刹车!");
}
}
//这个类用来做什么呢?这个类用来使用Car类,创建一个Car的实例,并通知它停下来(Stop),当然,还得告诉Car,停下来的时候要发出通知给HandlerEvent函数
class CarHandler
{
//这个方法用来做什么呢?它的参数和声明的委托一样,这两个有联系嘛?
//用来响应eventCar事件的,它是被函数指针指向的目标,所以它的参数和返回值,必须与函数指针类型定义的一致。
public void HandlerEvent(string msg)
{
//这里为何只输出一个msg参数呢,代表什么呢?这是对Stop动作中的事件eventCar("刹车!")的响应,表示刹车事件的发生。而这里仅仅是把刹车事件显示出来,并没有做别的什么后继的操作。
Console.WriteLine(msg);
}
}
class Program
{
public static void Main(string[] args)
{
Car car = new Car();
CarHandler handler = new CarHandler();
//这句是什么意思,说+=用来订阅事件的,我不太理解这个概念。希望把这句话详细的解释一下比如:+=用来做什么/Car.delegateCar用来做什么/Car.delegateCar用来做什么/
//handler.HandlerEvent是被指向的函数,Car.delegateCar是函数指针类型,car.eventCar是函数指针变量。我理解就是把被指向的函数,封装成函数指针类型的实例,存入变量中(这里用+=,而不用=,这是因为委托可以指向多个函数,相应的,还可以用-=来解除一个函数)
//我更喜欢一个简化的方法:car.eventCar += handler.HandlerEvent;我的理解就是让car.eventCar指向handler.HandlerEvent
car.eventCar += new Car.delegateCar(handler.HandlerEvent);
//这里为和调用stop()。调用停车功能,car对象会在执行完停车的任务后,自动触发刹车事件
car.Stop();
}
}


--------------------编程问答-------------------- 嗯,对class CarHandler的说明错了,改类仅仅提供了一个函数,用来响应事件而已 --------------------编程问答-------------------- 其实你只要理解委托就可以了。
委托就好比生孩子。
你是人类,同时也是一个人,这是一个实例。但是你是男的所以生不了孩子,你可以找个女的委托一个女的帮你生孩子。
这里你就是Car类,而生孩子的事件就是eventCar,而这个事件中msg就是你得sperm,具体怎么生孩子又女的自己决定。呵呵,不知道这样你是否能够明白 --------------------编程问答-------------------- 突然发现自己太有才了 --------------------编程问答-------------------- 委托就是函数指针
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,