`

委托事件及其他

    博客分类:
  • .net
阅读更多
委托事件及其他


声明委托   以下语句: 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#中委托与事件的区别

    事件是一种用于实现观察者模式(Observer Pattern)的机制,它允许一个类或对象(发布者)向其它一个或多个类或对象(订阅者)通知状态的改变。 在C#中,事件通常通过使用关键字event来声明。使用时,发布者提供...

    .NET委托与事件用例

    .NET框架中的委托和事件是两种核心的编程概念,它们在构建可扩展、反应式和异步应用程序时起着至关重要的作用。本文将深入探讨.NET委托和事件,以及它们如何在实际应用中发挥作用。 首先,我们需要了解什么是委托。...

    C# 委托和事件 (详细讲解)

    在C#编程语言中,委托和事件是两个关键的概念,它们是实现面向对象设计模式,尤其是事件驱动编程的核心。下面将详细阐述这两个概念及其在实际编程中的应用。 **委托** 委托在C#中相当于一种类型,它封装了指向方法...

    c#委托和事件教程,委托事件教程

    - 委托的定义可以在命名空间、类或其他类型的内部进行,但不能派生新的委托类型。 3. **委托的使用** - 创建委托实例时,我们可以将其关联到一个方法,这称为委托实例的"绑定"。例如: ```csharp MyDelegate ...

    C#委托事件实例

    在C#编程语言中,委托和事件是两个关键特性,它们...总的来说,理解和掌握C#的委托事件对于任何想要深入学习.NET框架的开发者来说都是至关重要的。通过实例学习,初学者和进阶者都能从中受益匪浅,提升自己的编程技能。

    winform委托和事件经典例子

    接下来是事件,它是对象向其他对象通知其状态改变的一种方式。在Winform中,控件通常会引发事件,比如按钮的Click事件。事件的处理是通过事件处理程序,这些处理程序是通过委托来注册的。当事件发生时,注册的处理...

    对C#委托及事件委托的理解

    C#中的委托是面向对象编程的一种强大特性,它允许我们将方法作为参数传递给其他方法,或者将多个方法链接在一起形成一个事件处理链。本文将深入探讨C#中的委托和事件委托的概念、用途以及它们的工作原理。 1. **...

    c#中的委托与事件把委托事件讲透 读书笔记 学习心得

    事件是一种特殊类型的委托,它用于通知其他对象发生了某些事情。事件的声明方式如下: ``` public event MyDelegate MyEvent; ``` 在上面的代码中,我们声明了一个名为`MyEvent`的事件,该事件可以持有对一个方法的...

    ASP.NET委托和事件

    控制器或其他类可以通过添加或移除事件处理程序来订阅或取消订阅事件。这通常在`Page_Load`或控件的初始化方法中完成。 ```csharp Button1.Click += Button_Click; // 订阅 Button1.Click -= Button_Click; // ...

    c#委托事件异步例子

    在C#编程中,委托和事件是两种非常重要的特性,它们是实现面向对象设计的关键工具,尤其是对于构建异步应用程序。下面将详细讲解这两个概念及其在异步编程中的应用。 一、委托 委托在C#中可以被视为一种类型,它...

    委托事件学习教案.pptx

    事件的主要作用是分离数据和行为,使得对象能通知其他对象特定情况的发生。 - **事件委托**: 定义事件委托通常是多播的,即它可以连接多个事件处理程序。例如,`.NET Framework`中的`MouseEventHandler`就是一个...

    C# 委托 线程 事件的事例代码

    在C#编程中,委托、线程和事件是三个核心概念,它们对于构建高效、响应式的多任务应用程序至关重要。下面将详细阐述这三个概念及其相互之间的关系,并通过一个实例代码进行说明。 1. 委托(Delegate): 委托在C#中...

    委托事件PPT课件.pptx

    委托可以被视为安全的函数指针,而事件则利用委托实现了发布-订阅模式,让对象能够通知其他对象关于特定行为的发生,而无需知道接收者是谁。这种设计模式提高了代码的灵活性和可维护性,在UI响应、异步编程和多线程...

    C#事件和委托

    事件是基于委托的一种特殊类型的多播委托,它用于在特定的事件发生时通知其他的对象。在C#中,委托和事件的使用非常广泛,它们是实现代码解耦合、支持事件驱动编程模型和设计模式(如观察者模式)的基础。 首先,...

    C#委托事件.zip

    当用户触发特定操作时,控件会引发事件,而其他对象可以订阅这些事件并提供处理逻辑。 ```csharp class Program { static void Main() { DelegateExample publisher = new DelegateExample(); Subscriber ...

    详解C#委托,事件与回调函数

    委托是 C# 中一种非常重要的概念,它可以将方法作为参数传递给其他方法,也可以将方法作为返回值返回给其他方法。委托的定义是:delegate 返回类型 委托名(参数列表);例如:delegate string ProcessDelegate(int ...

    C#委托和事件、事件的工作原理

    事件是基于委托的消息机制,它允许一个对象在发生某个事件时通知其他对象。事件的定义需要使用关键字event,并指定事件的委托类型。例如,public class Employee{ public event DelegateClassHandle PlayGame; ...}...

    C# 中委托事件的理解实例

    在C#编程语言中,委托和事件是两个关键的概念,它们是实现事件驱动编程的核心机制。委托可以看作是类型安全的函数指针,允许我们传递方法作为参数,或者存储和调用方法。事件则是基于委托的一种通信机制,用于在对象...

Global site tag (gtag.js) - Google Analytics