C#基础---委托的使用

 

一:什么是委托

      委托是一种定义方法签名的类型当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。您可以通过委托实例调用方法。委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。 委托可以引用静态方法和非静态方法。

通俗的理解是,委托其实可以是一种简单的约束,好比在工作上我声明了一个委托人A, A同时可以接受(人力资源,后勤公务)两个参数,那么只要是有人想处理(人力资源,后勤)方面的事情,都可以去注册到委托人A上,A有能力接受这些方法,然后去处理。

二:委托的声明

声明委托可以通过delegate来声明,委托可以依赖于一个类,也可以依赖于一个namespace间。即 在类里面声明和在类外面声明。其中delegate可以有返回类型和非返回类型,其中delegate也支持泛型。

public delegate double AddNum(double num1,double num2);
public delegate void ShowMsg(string str);

  三: 委托的使用

     1. 基本使用:下面是一个计算方法,声明了一个委托CalculatorDelegate,然后在Main方法里面先后注册了AddNum,和SumNum方法,注册的方法必须与委托的参数以及返回类型相符合,否者将会提示【委托与注册方法不匹配的提示】对于这块是直接编译无法通过的。委托如果被注册了多个方法,称为多播。对于多播,调用委托后,按照注册顺序执行。不过对于有返回值的方法,将返回最后注册的方法执行后的返回值。

Notes:第一次注册方法的时候可以使用【=注册】或者【new CalculatorDelegate(方法名) 】,后面添加方法用【+】,取消注册方法用【-】

运行代码和运行结果如下图:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SpongeBobCoder.Delegate
{
public delegate double CalculatorDelegate(double num1, double num2); // 委托,声明在类之外 public class Program
{
public static double AddNum(double num1, double num2)
{
Console.WriteLine("Sum={0}", num1 + num2);
return num1 + num2;
} public static double SubNum(double num1, double num2)
{
Console.WriteLine("Sub={0}", num1 - num2);
return num1 - num2;
} public static void Main(string[] args)
{
CalculatorDelegate calculatorDel = AddNum; // 目前为单播
Console.WriteLine("委托一个方法的结果为:{0}", calculatorDel(1, 2));
calculatorDel += SubNum; // 目前是多播
Console.WriteLine("委托两个方法的结果为:{0}", calculatorDel(1, 2));
Console.ReadKey();
}
}
}

    2. 委托注册方法的几种形式:除了上面的方式,其实委托的注册方法还支持Linq方法,匿名方法。其实在Linq中也大量的委托,比如在使用List<T>.where(),List<T>.sort()这些方法的时候其实里面就运用的大量的委托。其实可以理解为就是委托的缩影。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SpongeBobCoder.Delegate
{
public delegate double CalculatorDelegate(double num1, double num2); // 委托 public class Program
{
public static void Main(string[] args)
{
CalculatorDelegate calculatorDel = delegate(double x, double y) //等效于AddNum方法
{
return x + y;
};
Console.WriteLine("委托一个方法的结果为:{0}", calculatorDel(1, 2)); calculatorDel += (x, y) => // 等效于SumNum方法
{
return x - y;
}; Console.WriteLine("委托两个方法的结果为:{0}", calculatorDel(1, 2));
Console.ReadKey();
}
}
}

     3. 小添加: 其实在.net框架提供了自带的委托. Action<T>,Func<T,out Result>。Action是无返回值泛型委托,Func是有返回值的泛型委托【out Result就是返回值,不过使用的时候不是要传入一个out参数,对于Action<T,T,out Result>,其实就是传入2个参数。】代码如下:

          Notes:注意Func<>三个参数,可是AddNum只有两个,其实第三个就是对应的返回值,这里有别于我们前面说的委托,希望大家注意.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SpongeBobCoder.Delegate
{
public class Program
{
private static void ShowMsg(string str)
{
Console.WriteLine(str);
} private static double AddNum(double num1, double num2)
{
return num1 + num2;
} public static void Main(string[] args)
{
Action<string> action = ShowMsg;
action("Action委托好用!");
Func<double, double, double> func = AddNum; // Notes
Console.WriteLine("Func委托真好用,两数之和为:{0}", func(1, 2));
Console.ReadKey();
}
}
}

C#_委托的使用的更多相关文章

  1. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

  2. C#_委托与事件

    委托: 把方法当作参数进行传递 public delegate void AddDelegate(string name); public class Ad{ //addDelegate就是委托的一个 ...

  3. C#_委托

    委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子. 那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两门语言, ...

  4. 正经学C#_委托

    以前不会,甚至连想去学都没想.啧啧啧,我是何等朽木啊. 我先不说其中理念,或者原理,咱就先说最简单的用法.怎么去使用委托. 委托 Delegate 使用委托,就要先定义一个委托.定义一个委托就要先声明 ...

  5. 高级部分_委托、Lambda表达式、事件

    委托 (1)把方法当作参数来传递的话,就要用到委托: (2)委托是一个类型,这个类型可以赋值一个方法的引用. C#使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成:然后使用 ...

  6. 类库、委托、is as运算符、泛型集合

    类库: 说白了,就是让别人调用你写的方法,并且不让别人看到你是怎么实现的. 如果有功能你不会做,需要别人帮忙,那么你的同事可以帮你写好一个类,然后你来调用这个类中的方法,完成你的项目. 1.C#源代码 ...

  7. 匿名函数和Lamda

    不是本人所写!网络收集 C#中的匿名函数和Lamda是很有意思的东东,那么我们就来介绍一下,这到底是什么玩意,有什么用途了? 打开visual studio 新建一个控制台程序. 我们利用委托来写一个 ...

  8. 不用Invoke就等用 Control.CheckForIllegalCrossThreadCalls = false;

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. 2013传智播客视频--.ppt,.pptx,.doc,.docx.目录

    \!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.docx; \!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.pp ...

随机推荐

  1. python自动化报告的输出

    1.设计简单的用例 2.设计用例 以TestBaiduLinks.py命名 # coding:utf-8 from selenium import webdriver import unittest ...

  2. python第三十天-类

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很 ...

  3. 3星|《创投42章经》:前VC投资人的商业评论文集

    创投42章经:互联网商业逻辑与投资进阶指南 作者2014年入行VC做投资人,2016年退出改作自媒体.书中主要是作者的各类商业评论的文集,少部分是跟投资相关的内容. 投资相关的内容,有些作者自己的视角 ...

  4. iOS时间显示今天昨天

    一.前言 今天无意间想起写这个功能,仔细考虑了一下,其实很简单,整体思路如下: 先获取你所要转换的时间的年月日,然后再获取今天和昨天的年月日,然后对比,进而返回不同的字符串. 二.实现步骤 首先,我们 ...

  5. win10 文件扩展名的更改

    win10 文件扩展名的改 随便打开一个文件夹,最好是"此电脑",  第二行是 "     文件  -   计算机  -  查看   " 在查看里面就可以更改了 ...

  6. switch语句(初学者)

    C语言提供了另一种用于多分支选择的switch语句(常用于开关),一般形式为: switch ( 常量表达式 ) { case 常量1 :语句; case 常量2 :语句; case 常量3 :语句; ...

  7. Git基础命令的使用——详细教程2

    Git安装默认完成后,在左面点击鼠标右键,鼠标右键菜单中会多出来两个选项: a)  Git GUI Here <—>  图型界面模式 b) Git Bash Here <—> ...

  8. (一 ) 天猫精灵接入Home Assistant-服务器搭建

    ()1登陆阿里云 https://ecs.console.aliyun.com/?spm=5176.2020520001.0.0.6B1Uov#/home 账号dongdongmqtt 密码***** ...

  9. 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html

    [.NET基础]--委托.事件.线程(1)   1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...

  10. mybatis基础系列(三)——动态sql

    本文是Mybatis基础系列的第三篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(二)--基础语法.别名.输入映射.输出映射 mybatis基础系列(一)--mybatis入门 动态 ...