c#委托与事件(详解)

 更新时间:2021年07月08日 10:08:50   作者:小狐狸FM  
本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论

前言

.NET中的委托是一个类,它定义了方法的类型,是一个方法容器。委托把方法当作参数,可以避免在程序中大量使用条件判断语句的情况。

项目名为Testclass类名为Program

一、声明方法

class类中声明几个方法,以便委托的使用。

using System;
namespace Test
{
    class Program
    {
        /// <summary>
        /// 返回两个数中较大者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int max(int num1, int num2)
        {
            return num1 > num2 ? num1 : num2;//如果num1大于num2时,就返回num1,否则返回num2
        }
        /// <summary>
        /// 返回两个数中较小者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int min(int num1, int num2)
        {
            return num1 > num2 ? num2 : num1;//如果num1大于num2时,就返回num2,否则返回num1
        }
        static void Main(string[] args)
        {
        }
    }
}

二、声明委托

声明时使用delegate关键字来声明委托,委托声明定义了一个从System.Delegate类派生的类。

返回类型需要和方法的返回值类型相同,参数需要和传入方法的参数列表相同。

在前方也可以添加访问修饰符privatepublic

声明委托: delegate [返回类型] [委托名](参数1,参数2,....);
using System;
namespace Test
{
    class Program
    {
        delegate int De(int num1,int num2);
        /// <summary>
        /// 返回两个数中较大者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int max(int num1, int num2)
        {
            return num1 > num2 ? num1 : num2;//如果num1大于num2时,就返回num1,否则返回num2
        }
        /// <summary>
        /// 返回两个数中较小者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int min(int num1, int num2)
        {
            return num1 > num2 ? num2 : num1;//如果num1大于num2时,就返回num2,否则返回num1
        }
        static void Main(string[] args)
        {
        }
    }
}

三、实例化委托

定义委托类后,可以创建委托类的实例,实例化委托的方式有两种。

实例化委托方式一:[委托名] 变量名= new 委托名(方法名); 实例化委托方式二:[委托名] 变量名= 方法名;

using System;
namespace Test
{
    class Program
    {
        delegate int De(int num1,int num2);
        /// <summary>
        /// 返回两个数中较大者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int max(int num1, int num2)
        {
            return num1 > num2 ? num1 : num2;//如果num1大于num2时,就返回num1,否则返回num2
        }
        /// <summary>
        /// 返回两个数中较小者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int min(int num1, int num2)
        {
            return num1 > num2 ? num2 : num1;//如果num1大于num2时,就返回num2,否则返回num1
        }
        static void Main(string[] args)
        {
            De test1 = new De(max);//实例化委托与方法的对象
            De test2 = new De(min);//实例化委托与方法的对象
        }
    }
}

四、使用委托

在上一个步骤中,test1是委托De与方法max有关的实例化对象

test2是委托De与方法min有关的实例化对象

如果之后需要使用到max方法,就通过test1(参数列表)的方式调用该方法

如果之后需要使用到min方法,就通过test2(参数列表)的方式调用该方法

传入的参数需要和方法定义的形参相同类型、相同个数

在这里插入图片描述

using System;
namespace Test
{
    class Program
    {
        delegate int De(int num1,int num2);
        /// <summary>
        /// 返回两个数中较大者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int max(int num1, int num2)
        {
            return num1 > num2 ? num1 : num2;//如果num1大于num2时,就返回num1,否则返回num2
        }
        /// <summary>
        /// 返回两个数中较小者
        /// </summary>
        /// <param name="num1">int类型</param>
        /// <param name="num2">int类型</param>
        /// <returns></returns>
        public static int min(int num1, int num2)
        {
            return num1 > num2 ? num2 : num1;//如果num1大于num2时,就返回num2,否则返回num1
        }
        static void Main(string[] args)
        {
            De test1 = new De(max);//实例化委托与方法的对象
            De test2 = new De(min);//实例化委托与方法的对象
            Console.WriteLine("max方法:{0}",test1(10, 20));//调用max方法,并将结果显示到屏幕
            Console.WriteLine("min方法:{0}",test2(10,20));//调用min方法,并将结果显示到屏幕
        }
    }
}

总结

本篇文章就到这里了,想能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C#从字符串中指定位置移除子字符串的方法

    C#从字符串中指定位置移除子字符串的方法

    这篇文章主要介绍了C#从字符串中指定位置移除子字符串的方法,涉及C#中Remove方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C# NullReferenceException解决案例讲解

    C# NullReferenceException解决案例讲解

    这篇文章主要介绍了C# NullReferenceException解决案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详谈C# 图片与byte[]之间以及byte[]与string之间的转换

    详谈C# 图片与byte[]之间以及byte[]与string之间的转换

    下面小编就为大家带来一篇详谈C# 图片与byte[]之间以及byte[]与string之间的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#操作FTP出现500错误解决办法

    C#操作FTP出现500错误解决办法

    最近在做项目的时候需要操作ftp进行文件的上传下载,但在调用using (var response = (FtpWebResponse)FtpWebRequest.GetResponse())的时候总是出现"远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)"的异常
    2014-03-03
  • 详解C# Socket简单例子(服务器与客户端通信)

    详解C# Socket简单例子(服务器与客户端通信)

    这篇文章主要介绍了详解C# Socket简单例子(服务器与客户端通信) ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • .NET单点登陆的实现方法及思路

    .NET单点登陆的实现方法及思路

    这篇文章介绍了.NET单点登陆的实现方法及思路,有需要的朋友可以参考一下,希望对你有所帮助
    2013-07-07
  • C#实现基于任务的异步编程模式

    C#实现基于任务的异步编程模式

    本文详细讲解了C#实现基于任务的异步编程模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#反射调用拓展类方法实例代码

    C#反射调用拓展类方法实例代码

    这篇文章主要给大家介绍了关于C#反射调用拓展类方法的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • C# 得到某一天的起始和截止时间的代码

    C# 得到某一天的起始和截止时间的代码

    自己的制作的单词学习程序中需要得到某一天的起始和截止时间,找了一下,使用一个字符串来转换比较方便
    2011-11-11
  • WPF使用Geometry绘制几何图形

    WPF使用Geometry绘制几何图形

    这篇文章介绍了WPF使用Geometry绘制几何图形的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论