`

委托与事件的区别

 
阅读更多

 

 事件有发送者和接收方。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。       在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。(浅显的说:例如,我要吃饭,事件的发送者是我,但我并不知道谁将做饭给我吃,是妻子呢,还是老妈呢,还是老爸呢等等。所以引出了委托,就是这个事件交给谁做。 

委托好比一个指挥官,指向妻子,妻子做,指向老妈,老妈做
Public delegate [返回值] delegatename(委托的名字)(参数列表……..)
Public event DelegateName(自定义的一个委托) MyClick;

事件是一种特殊的委托,因为事件是对委托的封装,就像字段被封装成属性,因为对于事件来讲内部永远是private的,外部只能“注册自己+=、注销自己-=”,在本类是可以用=的(赋值一个方法),外界不可以注销其他的注册者,外界不可以主动触发事件,从而起到封装的作用;而委托时可以=的,即赋值,这样委托就重新new了之前+=或者赋值的都不存在了,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。所以简单来说事件就是对委托的封装,防止外部类对其进行赋值;

 

 

namespace DelegateAndEvent

{

    public delegate void GreetingDelegae(string name);

    public class Manager

    {

        public GreetingDelegae delegate1;

        public event GreetingDelegae event1;

 

        public void Greeting(string name)

        {

            if (delegate1 != null)

                delegate1(name);

            if (event1 != null)

                event1(name);

            event1 = Test;//在定义事件的本类中时可以赋值的

        }

 

        public void Test(string name)

        {

        }

    }

}

 

 

 

 

namespace DelegateAndEvent

 

{

 

    /// <summary>

 

    /// MainWindow.xaml 的交互逻辑

 

    /// </summary>

 

    public partial class MainWindow : Window

 

    {

 

        public MainWindow()

 

        {

 

            InitializeComponent();

 

            Manager m = new Manager();

 

            m.delegate1 = English;//委托的话可以用=号,即赋值

 

            m.delegate1 += Chinese;

 

            m.delegate1 = Chinese;//如果是再加这句那么之前加的就都没有了,因为委托时public的,外部可以更改的,这是为什么要有event

 

            //因为event外部只能+=和-=,不能赋值,只有内部才可以赋值,这样就保护了该事件成员在外部不会被new了

 

            m.event1 += new GreetingDelegae(English);//不能=的,会出错

 

            m.event1 += new GreetingDelegae(Chinese);

 

        }

 

 

 

        public void English(string name)

 

        {

 

            MessageBox.Show("hello," + name);

 

        }

 

        public void Chinese(string name)

 

        {

 

            MessageBox.Show("你好," + name);

 

        }

 

    }

 

}

 

分享到:
评论

相关推荐

    C#中委托与事件的区别

    此外,关于委托和事件的中间代码,也就是编译器在编译时生成的与委托和事件相关的IL代码,同样需要深入理解。中间代码涉及到方法指针、调用约定、闭包等概念,它们是理解.NET运行时如何实际执行委托和事件操作的关键...

    C#--委托和事件

    ### C#中的委托和事件 #### 一、委托的基础概念 在C#中,委托是一种引用类型的数据结构,它允许将方法当作参数进行传递。简而言之,委托就是指向一个方法的引用。委托的主要用途是作为事件处理程序的类型。 **...

    C# 委托与事件的概念及理解

    C# 委托与事件的概念及理解 委托是 C# 中一个非常重要的概念,它可以看作是一个函数指针,能够引用对象方法,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个对象方法,将其作为它构造函数的...

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

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

    事件和委托的详细区别

    在C#编程中,事件和委托是两种重要的概念,它们在软件设计模式中扮演着关键角色,尤其是对于事件驱动编程和回调机制。下面我们将详细讨论它们的区别和使用场景。 首先,委托在C#中是一种类型安全的函数指针,它允许...

    unity-委托事件的用法和差别

    展示了委托和事件的用法,一节委托和事件的区别!!!!!

    C#委托与事件PPT

    `EventHandler&lt;TEventArgs&gt;`是一个预定义的泛型委托,它接受一个`object`参数(通常是事件源)和一个`TEventArgs`参数,其中`TEventArgs`是一个派生自`EventArgs`的类,用于传递与事件相关的数据。例如,`Click`事件...

    C#编程艺术:委托与事件的深度解析

    #### 四、委托与事件的区别 尽管委托和事件在某些方面相似,但它们之间存在一些关键区别: 1. **目的**:委托主要用于将方法作为参数传递,而事件用于在对象之间发送消息。 2. **访问级别**:委托通常是公开的,...

    C# MVC 委托和事件

    事件通常与用户界面交互或系统事件相关联,允许代码响应特定事件的发生而无需直接调用。 1. **事件的基本使用** 事件由`event`关键字声明,它通常作为类的私有成员,只允许发布事件,而订阅事件则通过公共的`add`...

    事件与委托案例Demo

    4. 静态与非静态事件:理解两者之间的区别,以及在不同场景下的选择。 5. 委托的匿名方法与Lambda表达式:简化代码,使事件处理更加简洁。 6. 委托的多播与委托链:解释如何在一个委托实例中调用多个方法。 “C# 中...

    C# 中的委托和事件究竟有何不同

    总结起来,委托和事件的主要区别在于,委托是一种通用的多方法引用,可以在代码中自由使用,而事件是委托的一种受限形式,主要用于实现发布-订阅模式,确保安全、低耦合的通信。理解这两者之间的关系和差异,将有助...

    C#中委托和事件的区别实例解析

    在C#编程语言中,委托和事件是两个重要的特性,它们都涉及到方法的回调机制,但有着明显的区别。本文将详细解析这两个概念及其差异,并通过实例来阐述它们的工作原理。 首先,委托在C#中是一种类型,它代表了一组...

    C#中的委托和事件(续).pdf

    本文将继续深入探讨委托和事件的一些细节,包括事件与委托的区别、事件访问器、异常处理、超时处理以及异步方法调用等内容。 #### 为什么使用事件而不是委托变量? 在讨论委托和事件时,经常提到的一个问题是:**...

    -001 委托与事件.rar

    内容概要:普通委托,委托作为参数,多播委托 只能获得最后一个返回值,匿名方法,Lamda表达式,事件,事件与委托的区别

    浅析C#委托和事件实例

    C#中的委托和事件是面向对象编程中两个重要的特性,它们在实际的软件开发中扮演着关键角色,尤其是在处理事件驱动编程和回调机制时。本文将深入解析C#中的委托和事件,通过实例来帮助理解它们的工作原理和应用场景。...

    事件与委托

    - **事件与委托的区别**:委托可以被任意多次调用,而事件则不能直接调用。事件只能由定义事件的类通过调用事件触发器来触发。 - **事件的安全性**:通过事件,可以在不影响发布者的情况下改变订阅者的行为,从而...

    C#中的委托和事件(续)

    在讨论为什么在类型中使用事件向外部提供方法注册而不是直接使用委托变量之前,我们需要理解事件与委托变量之间的区别及其背后的设计理念。 **事件应该是由事件发布者触发** 在C#中,事件和委托虽然紧密相关,但...

    vb.net 委托与非委托对线程的影响

    本文将深入探讨“委托”和“非委托”在子线程与UI线程交互中的作用,以及它们如何影响程序的性能和响应性。 首先,让我们了解什么是委托。在.NET框架中,委托是一种类型安全的函数指针,可以引用方法。它允许我们将...

    CSharp_Delegate C#委托

    C#委托是.NET框架中的一种强大的特性,它允许我们封装方法作为...熟练掌握委托的声明、实例化、调用以及与事件的结合,能极大地提高开发效率和代码质量。在实际开发中,合理利用委托可以构建出优雅、可扩展的解决方案。

Global site tag (gtag.js) - Google Analytics