首页 > 编程语言 >c#学习笔记-------------------c#中的委托

c#学习笔记-------------------c#中的委托

时间:2023-06-24 17:57:27浏览次数:53  
标签:Console 委托 c# sw 笔记 ------------------- int WriteLine 方法

一、什么是委托

委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。

委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情。

委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它,

函数也可以用委托变量指向它。我们可以选择将委托类型看做只定义了一个方法的接口,而委托的实例可以看做是实现了那个接口的一个对象。

简单的讲委托可以看作一个特殊的对象,可以将方法当作参数进行传递,保存对函数的引用。可以将委托看成执行方法的一个东西。

二、委托的使用场景

1.事件处理:在 C# 中,事件通常使用委托来实现。您可以创建一个委托,将事件与委托关联,并在代码中处理事件时使用委托。

例如:如果你在Windows窗体应用中放置了一个按钮,用户点击按钮会触发点击事件,这时候就需要用委托事先定义好触发事件的处理方法

 

2.回调方法:委托可以用作回调方法,允许您在一个方法执行完毕后调用另一个方法。

例如:当你启用Task异步处理一个tcp下载任务,这时候你需要用委托给他一个下载任务执行完成之后通知任务完成的方法

 

3.多路广播:使用委托,您可以同时调用多个方法。这种方法称为多路广播,可以在同一事件上广播多个处理程序。

例如:C#的委托可以同时指向多个函数,可以使用MulticastDelegate(多播委托类)

 

4.集合操作:委托可以用作 LINQ 查询的过滤器,以便在集合中筛选数据。

例如:当你要对某个List集合进行操作时,修改某些数据或者打印值,可以使用:ForEach方法然后将对应的处理方法包装在委托传入

 

三、委托的使用

委托声明:委托必须先声明再使用

       //委托的声明
        delegate void MyDel(int value); //委托的是无返回值,且单一int参数的方法
        //关键字 返回类型 委托类签名 签名
public delegate void MyNoReturnNoParaDelegate ();//无参数无返回值委托
public delegate void MyNoReturnWithParaDelegate (int x, int y);//带参无返回值委托
public delegate int MyWithReturnWithParaDelegate (int x, int y);//带参有返回值委托

委托实例化:

 //实例化一个委托并且将相同前面的异步方法传入
            AsyncMethodCaller caller = new AsyncMethodCaller(TestMethodAsync);

  /// <summary>
        /// 与委托对应的方法
        /// </summary>
        /// <param name="callDuration"></param>
        /// <param name="threadId"></param>
        /// <returns></returns>
        static string TestMethodAsync(int callDuration, out int threadId)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine("异步TestMethodAsync开始");
            for (int i = 0; i < 5; i++)
            {   // 模拟耗时操作
                Thread.Sleep(callDuration);
                Console.WriteLine("TestMethodAsync:" + i.ToString());
            }
            sw.Stop();
            threadId = Thread.CurrentThread.ManagedThreadId;
            return string.Format("耗时{0}ms.", sw.ElapsedMilliseconds.ToString());
        }
  //使用lambda表达式传入一个匿名方法实例化委托
            AsyncMethodCaller22 caller2 = new AsyncMethodCaller22((callDuration) => {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                Console.WriteLine("异步TestMethodAsync开始");
                for (int i = 0; i < 5; i++)
                {   // 模拟耗时操作
                    Thread.Sleep(callDuration);
                    Console.WriteLine("TestMethodAsync:" + i.ToString());
                }
                sw.Stop();
                return string.Format("耗时{0}ms.", sw.ElapsedMilliseconds.ToString());
            });

 

//多播委托的实现
internal class Program
    {
//委托的声明
delegate string MyDel(int value); //委托的是无返回值,且单一int参数的方法
//关键字 返回类型 委托类签名 签名
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
MyDel mydel = new MyDel(TestMethodAsync1);//实例化委托,并传入第一个方法
mydel += TestMethodAsync2;//添加第二个方法
mydel.Invoke(1000);//执行
Console.WriteLine("多播委托会按照添加顺序执行传入的方法");
mydel -= TestMethodAsync2;//从委托实例中注销第二个方法
Console.WriteLine("某个方法注销后便不再执行");
mydel.Invoke(1000);
Console.ReadKey();
}

/// <summary>
/// 与委托对应的方法1
/// </summary>
/// <param name="callDuration"></param>
/// <param name="threadId"></param>
/// <returns></returns>
static string TestMethodAsync1(int callDuration)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("异步TestMethodAsync1开始");
for (int i = 0; i < 5; i++)
{ // 模拟耗时操作
Thread.Sleep(callDuration);
Console.WriteLine("TestMethodAsync1:" + i.ToString());
}
sw.Stop();
return string.Format("耗时{0}ms.", sw.ElapsedMilliseconds.ToString());
}

/// <summary>
/// 与委托对应的方法2
/// </summary>
/// <param name="callDuration"></param>
/// <param name="threadId"></param>
/// <returns></returns>
static string TestMethodAsync2(int callDuration)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("异步TestMethodAsync2开始");
for (int i = 0; i < 5; i++)
{ // 模拟耗时操作
Thread.Sleep(callDuration);
Console.WriteLine("TestMethodAsync2:" + i.ToString());
}
sw.Stop();
return string.Format("耗时{0}ms.", sw.ElapsedMilliseconds.ToString());
}


    }

四、官方提供的两种委托Action与Func

Action:没有返回值,参数可有可无,最多支持16个泛型参数,使用方法与自定义委托类类似

            Action action = new Action(NoReturnNoParaMethod);
            action.Invoke();

Func: 必须有返回值,参数可有可无,最多支持16个泛型参数,使用方法与自定义委托类类似

            Func<int, int, int> func1 = new Func<int, int, int>(WithReturnWithParaMethod);
            int sum = myWithReturnWithParaDelegate(1, 2);

 

标签:Console,委托,c#,sw,笔记,-------------------,int,WriteLine,方法
From: https://www.cnblogs.com/misakayoucn/p/17501402.html

相关文章

  • C++ 核心指南之资源管理(上)
    C++核心指南(C++CoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C++专家创建的一份C++指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C++”。这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静......
  • Android显示系统-基本概念梳理
    DisplayStatestructDisplayState{//这里定义了Display变更类型,说明Display可能发生的变化类型enum{eSurfaceChanged=0x01,eLayerStackChanged=0x02,eDisplayProjectionChanged=0x04,eDisplaySizeChanged=0x08,......
  • http-equiv属性
    http-equiv的几个重要属性:refresh(重定向) <meta http-equiv="refresh" content="1;url=https://www.weimob.com">此处http-equiv属性定义为refresh,值为”1;url=https://www.weimob.com”,其值实现了2个功能,并使用分号进行分割。分号前面的数值1表示时间间隔为1秒,分号后面的......
  • Python json和pickle模块
    json和pickle模块用于序列化的两个模块序列化模块:json和picklejson,用于字符串和python数据类型间进行转换pickle,用于python特有的类型和python的数据类型间进行转换Json模块提供了四个功能:dumps、dump、loads、loadpickle模块提供了四个功能:dumps、dump、loads、......
  • Mysql-sql优化
    1.查看SQL执行频率分析当前数据库是查询频繁的,还是写入频繁的,一般都是查比较多咯。MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。show[session|global]status可以根据需要加上参数session或者global来显示对应级别的统计结果。如......
  • redis-string常用命令
    string类型的常用命令常用SET/GET SETk1v1 EX参数:以秒为单位设置过期时间setk2v2EX10PX参数:以毫秒为单位设置过期时间setk2v2PX10000EXAT参数:设置以秒为单位的UNIX时间戳所对应的时间为过期时间PXAT参数:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时......
  • 浅谈OpenCV的多对象匹配图像的实现,以及如何匹配透明控件,不规则图像
    浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件引子OpenCV提供的templateMatch只负责将(相关性等)计算出来,并不会直接提供目标的对应坐标,一般来说我们直接遍历最高的相关度,就可以得到匹配度最高的坐标。但是这样一般只能得到一个坐标。在实际操作中,我们可能需要......
  • PHP用Swoole的WebSocket功能编写聊天室Demo
    前提:linux环境下PHP有可用的Swoole扩展。9501端口可访问。后端<?phpclassHelper{/***@function将数组中的null值转化为空字符串*@param$arrarray要转化的数组*@returnarray*@othervoid*/publicstaticfuncti......
  • Cookie和Session
    Cookie和Session会话什么是会话?会话是浏览器和服务器之间的多次请求和响应也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话有状态会话:一个网站知晓你登陆过、存储了一些基本信......
  • CF1815E Bosco and Particle
    有个粒子初始在\(0\)位置,\(1\cdotsn\)位置分别为有一个对撞器,如果在\(0\)位置则向右,如果在\(n+1\)位置则向左。每个对撞器有一个\(01\)串,初始所有对撞器的指针都在开头,当粒子走到\(i\)位置时,对撞器所指的值为\(0\)则不改变方向,否则反向,指针指向下一个位置,如果在串......