C#中的委托(Delegate)和事件 (Event)详解与使用范例

这篇具有很好参考价值的文章主要介绍了C#中的委托(Delegate)和事件 (Event)详解与使用范例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.委托(Delegate)

1.委托(Delegate)简介

最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托.

下面是这种委托的实例代码

//定义一个继承自Delegate类的子类小明,这之后小明就具备被委托的属性
//public为公开,void为返回类型,XiaoMing为类名,(string msg)为传递给注册的方法的参数
public delegate void XiaoMing(string msg);
class Me
{
    //public代表聆听小明的信号是公开的方法,以便小明访问
    //static是为了固定ListenToXiaoMing在内存中的入口以便小明能够找到该方法的入口
    public static void ListenToXiaoMing(string msg)
    {
        if(msg == "Rain")
        {
            Console.WriteLine("下雨了!小明收衣服了!");
        }
        else if(msg == "Sunny")
        {
            Console.WriteLine("天晴了!小明晒衣服了!");

        }
    }
}


class Program
{
    static void Main(string[] args)
    {
        //初始化一个XiaoMing类的实体xiaoMing
        //将我的ListenToXiaoMing注册在xiaoMing上
        //相当于我与小明约定下雨后小明就通知我做出行动(调用ListenToXiaoMing)
        XiaoMing xiaoMing = Me.ListenToXiaoMing;



        //假设今天下雨
        string weather = "Rain";
        
        //小明观察天气
        //将weather参数传递给Me.ListenToXiaoMing方法
        xiaoMing.Invoke(weather);

    }
}

以上代码的输出为

下雨了!小明收衣服了!

值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类,该子类实例只接收void类型方法并且参数类型为(string)的注册,如:void foo(string test){}

public delegate void XiaoMing(string msg);

2.组播委托

你感觉小明的提醒十分靠谱,于是将这件事告诉了同样喜欢玩游戏的小刚,于是小刚也决定请小明在天气发生变化时提醒他,这就是组播委托.

当执行delegate.Invoke()时,将会执行所有注册在该delegate上的方法

以下是这种委托的代码:

public delegate void XiaoMing(string msg);


//你的类
class Me
{
    //public代表聆听小明的信号是公开的方法,以便小明访问
    //static是为了固定ListenToXiaoMing在内存中的入口以便小明能够找到该方法的入口
    public static void MeListenToXiaoMing(string msg)
    {
        if(msg == "Rain")
        {
            Console.WriteLine("下雨了!小明收衣服了!");
        }
        else if(msg == "Sunny")
        {
            Console.WriteLine("天晴了!小明晒衣服了!");

        }
    }
}


//小刚的类
class XiaoGang
{
    
    public static void XiaoGangListenToXiaoMing(string msg)
    {
        if (msg == "Rain")
        {
            Console.WriteLine("下雨了!小刚收衣服了!");
        }
        else if (msg == "Sunny")
        {
            Console.WriteLine("天晴了!小刚晒衣服了!");

        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        //初始化一个XiaoMing类的实体xiaoMing
        //将我的ListenToXiaoMing注册在xiaoMing上
        //相当于我与小明约定下雨后小明就通知我做出行动(调用ListenToXiaoMing)
        XiaoMing xiaoMing = Me.MeListenToXiaoMing;

        //小刚也将自己的XiaoGangListenToXiaoMing注册到被委托人小明身上
        xiaoMing += XiaoGang.XiaoGangListenToXiaoMing;



        //假设今天下雨
        string weather = "Rain";

        //小明观察天气
        //将weather参数传递给Me.ListenToXiaoMing方法
        //和XiaoGang.XiaoGangListenToXiaoMing方法
        xiaoMing.Invoke(weather);

    }
}

运行结果为

下雨了!小明收衣服了!
下雨了!小刚收衣服了!

注意事项:

在使用Delegate子类时,需要用如下代码进行初始化

//方法一 
XiaoMing xiaoMing; 
xiaoMing=Me.MeListenToXiaoMing;
//方法二
XiaoMing xiaoMing=Me.MeListenToXiaoMing;

//错误示范
XiaoMing xiaoMing;
xiaoMing+=Me.MeListenToXiaoMing;

3.事件(event)与委托配合

当你和小刚为小明的靠谱感叹时,天气变化无常的季节结束了,你们不再需要小明通知你们收放衣服了.

你们又有了新的需求----你喜欢在阴天运动,但是小刚喜欢在晴天运动,于是你们请小明吃了一顿饭,请求他在阴天通知你运动,在晴天通知小刚运动,这样的话你们就不用在收到阴天和晴天的消息时花费精力自行判断要不要运动了.

以下是这次委托的代码,小明将会根据不同情况通知不同的人

//好朋友小明类
class XiaoMing
{
    //定义一个继承自Delegate类的委托子类,就像是呼叫是人们通讯的方法
    //而小明的呼叫是继承自呼叫的子类
    public delegate void CallTFirends();


    //以下是事件,是一个用于触发不同委托的字段
    //这是委托你去运动的字段
    public  event CallTFirends CallMe;

    //这是委托小刚去运动的字段
    public event CallTFirends CallXiaoGang;
    
    
    
    //好心的小明用下面的方法时时关注天气
    public void LookForWeather(string weather)
    {
        if (weather == "Cloudy")
        {
            //与下方的CallXiaoMing?.Invoke();具有相同功能
            //即防止小明小刚还没通知喜欢哪种运动天气时进行提醒
            //防止在event还没注册时就被调用
            if (CallMe != null)
            {
                CallMe.Invoke();
            }
        }
        else if(weather == "Sunny")
        {
            CallXiaoGang?.Invoke();
        }

    }

}


//你的类
class Me
{
    //你收到小明的信号会调用以下方法去运动
    public static void MeListenToXiaoMing()
    {
       Console.WriteLine("小明运动啦!");
    }
}


//小刚的类
class XiaoGang
{

    //小刚收到小明的信号会调用以下方法去运动
    public static void XiaoGangListenToXiaoMing()
    {
        Console.WriteLine("小刚运动啦!");
    }
}

class Program
{
    static void Main(string[] args)
    {

        XiaoMing xiaoMing = new XiaoMing();
        //天气为阴天
        string weather = "Cloudy";

        //你注册了callMe的事件,意味通知小明在阴天通知你去运动
        xiaoMing.CallMe += Me.MeListenToXiaoMing;
        //小刚注册了XiaoGang.XiaoGangListenToXiaoMing事件,意味通知小明在晴天通知小刚去运动
        xiaoMing.CallXiaoGang += XiaoGang.XiaoGangListenToXiaoMing;

        //小明观察天气并且提醒对应的人去运动
        xiaoMing.LookForWeather(weather);
       

    }
}

运行结果为

小明运动啦!

细节提示:

1.事件只能在声明它的类中被触发(即例子中在XiaoMing类种才能触发),在声明它的类之外只能订阅和取消订阅。

2.事件的一大作用是方便由声明Delegate的类集中管理而不用每个类自行判断传输过来的信号,如你和小刚不用自行判断传来的天气适合做什么只需要在收到消息后去运动即可.文章来源地址https://www.toymoban.com/news/detail-411027.html

到了这里,关于C#中的委托(Delegate)和事件 (Event)详解与使用范例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式

    委托是一种类型,它可以存储对一个或多个方法的引用。它类似于C/C++中的函数指针,允许您将方法作为参数传递、存储和调用。 写法: delegate return_type delegate_name( ); return_type :表示委托所引用方法的返回类型。 delegate_name :表示委托的名称。 parameters :表示委托所引用方法

    2024年02月06日
    浏览(58)
  • 【unity小技巧】委托(Delegate)的基础使用和介绍

    在Unity中,委托( Delegate )是一种用于处理方法回调的特殊类型。它允许您将方法作为参数传递给其他方法,并在需要时调用这些方法。 委托在游戏开发中非常有用࿰

    2024年02月15日
    浏览(47)
  • UE4/5C++:Delegate(委托or代理?)的使用

    目录 DECLARE的使用 单播: 绑定UObject 绑定 调用 无参调用 解除绑定: 绑定Lambda表达式: 绑定c++原生的c++类的函数: 绑定共享指针: 绑定静态函数: 绑定线程安全的共享指针: 绑定一个Function方法: 多播 动态单播代理:  用在蓝图上: 在c++中如何绑定:  动态多播代理  

    2024年02月07日
    浏览(84)
  • 【C#学习笔记】委托与事件 (从观察者模式看C#的委托与事件)

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/134655722 作者:CSDN@|Ringleader| 主要参考: 委托(C# 编程指南) 事件介绍 C# 中的委托和事件简介 Delegate 类 Exploring the Observer Design Pattern微软技术文章翻译 委托是一种 引用类型 ,表示对具有特定参数列表和返回类型

    2024年02月04日
    浏览(49)
  • c# 事件与委托

    //在C#中, 事件是一种特殊的委托 ,它允许对象通知其他对象发生了某个特定的事件。 //事件通常用于GUI应用程序中,例如当用户单击按钮时,按钮控件会引发Click事件, //然后其他对象可以订阅该事件并执行相应的操作。 //以下是一个简单的示例,演示如何在C#中使用事件和

    2024年02月06日
    浏览(41)
  • C#委托和事件简单复习

    太久没用了,简单的复习一下 快速过一遍语法使用 1.定义一个委托类型 只需要在声明的前面加上delegate,其他的就跟声明一个方法(函数)类似 2.使用刚刚声明的委托 需要定义一个返回值跟参数与我们刚刚定义的委托一致 3.然后声明一个SayHello类型(委托)的变量 把

    2024年02月14日
    浏览(45)
  • 委托与事件(一)——C#版本

      委托是对 函数的封装 ,可以当作给方法的特征指定一个名称。而事件则是 委托的一种特殊形式 ,当发生有意义的事情时,事件对象处理通知过程。   委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有 完全相同的行为 。   用例子来说明为

    2023年04月09日
    浏览(45)
  • C#学习,委托,事件,泛型,匿名方法

    目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。特别用于实现事件和

    2024年02月12日
    浏览(46)
  • C#学习笔记8:接口、委托、事件

    今日继续我的C#学习之路,今日学习接口、委托、事件,文章从实践出发学习这三个设计理念,并提供完整源码 目录 1、接口(多重继承): 代码: 运行结果: 2、委托(方法的代理/函数指针): 创建控制台程序实现委托: 遇到的报错及解决: 修改后的代码: 运行结果: 3、

    2024年04月15日
    浏览(55)
  • c#事件(event)

    C#中的事件是一种特殊的委托,它用于实现观察者模式,允许对象在特定事件发生时通知其他对象。 以下是使用C#事件的示例: 首先,定义一个包含事件的类: 在上面的代码中,我们定义了一个EventPublisher类,其中包含一个名为MyEvent的事件。该事件基于EventHandler委托类型,它

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包