委托事件及其他
声明委托 以下语句: Copy Code
public delegate void ProcessBookDelegate(Book book);
声明一个新的委托类型。每个委托类型都描述参数的数目和类型,以及它可以封装的方法的返回值类型。
每当需要一组新的参数类型或新的返回值类型时,都必须声明一个新的委托类型。
实例化委托
声明了委托类型后,必须创建委托对象并使之与特定方法关联。与所有其他对象类似,新的委托对象用 new 表达式创建。
但是当创建委托时,传递给 new 表达式的参数很特殊:它的编写类似于方法调用,但没有方法的参数。
下列语句:
Copy Code
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
创建与静态方法 Test.PrintTitle 关联的新的委托对象。下列语句:
Copy Code
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的新的委托对象。
在两个例子中,新的委托对象都立即传递给 ProcessPaperbackBooks 方法。
请注意一旦创建了委托,它所关联到的方法便永不改变:委托对象不可改变。
调用委托 创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。
通过委托对象的名称(后面跟着要传递给委托的参数,括在括号内)调用委托对象。
下面是委托调用的示例: Copy Code
processBook(b);
在此示例中,可以通过使用 BeginInvoke 和 EndInvoke 方法同步或异步调用委托。
一、委托
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。
委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。
例程一:
using System;
namespace 委托
{
delegate int NumOpe(int a,int b); //委托声明
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
NumOpe p1 = new NumOpe(c1.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,
这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致。
二、事件
事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?
委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:
this.button1.Click += new System.EventHandler(this.button1_Click);
按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。
三、自定义事件及其处理
EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:
delegate void 事件委托名(object sender,EventArgs e);
object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。
例程二:
using System;
namespace 最简单的自定义事件
{
/// <summary>
/// 事件发送类
/// </summary>
class Class1
{
public delegate void UserRequest(object sender,EventArgs e); //定义委托
public event UserRequest OnUserRequest; //定义一个委托类型的事件
public void run()
{
while(true)
{
if(Console.ReadLine()== "a ")
{//事件监听
OnUserRequest(this,new EventArgs()); //产生事件
}
}
}
}
/// <summary>
/// 事件接收类
/// </summary>
class Class2
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);//委托实例化后绑定到事件
c1.run();
}
private static void c1_OnUserRequest(object sender, EventArgs e)
{//事件处理方法
Console.WriteLine( "\t你触发了事件! ");
}
}
}
例程三:
using System;
namespace 带事件数据的事件
{
/// <summary>
/// 带事件数据的事件类,从EventArgs继承
/// </summary>
class OnUserRequestEventArgs:EventArgs
{
private string inputText;
public string InputText
{
get
{
return inputText;
}
set
{
inputText = value;
}
}
}
/// <summary>
/// 事件发送类
/// </summary>
class Class1
{
public delegate void UserRequest(object sender,OnUserRequestEventArgs e);
public event UserRequest OnUserRequest;
public void run()
{
while(true)
{
Console.WriteLine( "请输入内容: ");
string a=Console.ReadLine();
//if(a== "a ")
//{
OnUserRequestEventArgs e1 = new OnUserRequestEventArgs();
e1.InputText = a;
OnUserRequest(this,e1);
//}
}
}
}
/// <summary>
/// 事件接收类
/// </summary>
class Class2
{
[STAThread]
static void Main(string[] args)
{
Class1 c1 = n委托-网络ew Class1();
c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
c1.run();
}
private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
{
Console.WriteLine( "\t你输入的是: "+e.InputText);
}
}
}
例程三跟例程二唯一的差别在于自定义了一个类OnUserRequestEventArgs,从EventArgs继承。
分享到:
相关推荐
C#委托事件,窗体之间可以传值 是两个可以看到效果的实例,也是基本思路,其他想怎么做只要稍微做一下扩展就可以了
代码是文章《在C++中模拟委托事件方法》的例子,文章地址为http://blog.csdn.net/gogogo/article/details/6996290,详述了通过静态函数、接口、类模板、类模板事件链等不同方式实现其他语言中的委托事件模式,对于...
C#面向对象:委托及事件,可将委托看作是一种新类型。当要把方法传递给其它方法时使用 –一个方法需要对另一个方法进行操作,此时需要将第二个方法作为参数传递到第一个方法中 •因为.Net是类型安全的,所以不允许...
例子中是文章《在C++中模拟委托事件方法》的例子,文章地址为http://blog.csdn.net/gogogo/article/details/6996290,详述了通过静态函数、接口、类模板、类模板事件链等不同方式实现其他语言中的委托事件模式,对于...
网上看到很多朋友都问,怎么实现多控件使用相同一个事件的问题,于是自己写点相关的实例。本实例用VB.net2008写的,不过其他版本的语言都基本大同小异。被实例涉及的内容。遍历窗体控件、事件委托等
里面是10张图片,图片里的内容是关于C#事件和委托的描述,是些理论方面的东西,当然这个网上其他地方也有,之所以传上是为了让别人可以快速的找到这些资料。
委托回调
C#开发过程中,委托和事件是其中最重要的东西,如果不会使用,那么你的C#开发就无法真正的明白。 共享一点资料出来,共大家一起学习提高,顺便赚点积分,好下载其他同学的资料。 共勉,共勉。。。 。。。
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。
大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和...
轻量级的DOM事件委托,小于1KB
事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需求...
它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子...
使用委托事件模拟多线程下载网络图片,即同时发送多个网络请求下载图片。 也可应用于其他异步多线程执行事件。
在windows 编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和...还可以利用将其他需要顺序执行的方法封装到button的click 事件的委托对象中,这样就能够顺序执行毁掉方法列表
委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法。下面的示例演示了一个委托声明: ...
委托(Delegate)特别用于实现事件和回调方法。所有的委托都派生自 System.Delegate 类。把一个方法当作参数传递,让其它方法进行调用执行。 1.委托的声明 委托声明决定了可由该委托引用的方法。委托可指向一个与其...
那么今天我就带着大家一起探讨下委托和事件。 咱们先来看下委托 我主要从以下几个方面讲解 1, 为什么使用委托 2.什么是委托 3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员...
在创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从声明它们的类中调用。派生类无法直接调用基类中声明的事件。尽管有时需要事件仅由基类引发,但在大多数情形下,应该允许派生类调用...
平滑滚动的简单原生 JavaScript 实现,它实现了事件委托和 requestAnimationFrame(包括 polyfill)。 这是我能找到的最精简、最简单的 vanilla javascript scroll 版本。 它是平滑滚动的修改版本。 重组以包含 ...