首页 > 编程语言 >c#之委托、泛型

c#之委托、泛型

时间:2023-04-05 18:37:06浏览次数:24  
标签:委托 c# System new 泛型 using 方法

委托:是一种类型,可“持有”多个方法,可以看作一个方法串(eg 糖葫芦)
委托相当于c++中的函数指针

在c#中,在类外,想要调用一个方法有两种方式
第一种:通过方法名。 1、实例名.方法名(实例方法) 2、类名.方法名(静态方法)
第二种:委托方式。

委托有两种类型
1、自定义委托 eg: delegate 返回值类型 委托名字(参数列表)
(注意!!因为委托是方法的包装器,所以参数列表中的参数是 方法!或委托! )
2、系统内置委托
常见的有
Action 泛型委托。(有参,无返回值)
Func泛型委托。(有参,有返回值)

委托的优点
1、可以通过一次操作,实现不同结果(多态思想)
通过不同的委托去调用同一个泛型方法,从而实现不同的结果

2、可以一次调用多个方法(多播),用“委托2+=委托1”

 `
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace myDelDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p1 = new Program();
            //MyDele<int> sumDele=new MyDele<int>(p1.Sum);
            Action<int,int> actionSum =new Action<int,int>(Add);
            actionSum(1,1);

            //泛型方法+泛型委托,可以实现,调用同一个方法,产生不同的结果
            var actionSum2 = new Action<string, string>(p1.Sum2);
            actionSum2("hello", "world");

            var actionSum3 = new Action<int, int>(p1.Sum2);
            actionSum3(9, 0);

            Func<int,int,int> funcAdd =new Func<int, int, int>(p1.Sum);
            Console.WriteLine(funcAdd(2,8));

            //MyDele<double> doubleDele = new MyDele<double>(Mul);
            var funcMul= new Func<double, double, double>(Mul);  //var简写形式
            Console.WriteLine(funcMul(2.2,3.3));
        }
     //   delegate T MyDele<T>(T a, T b);

        static void Add(int a ,int b)
        {
            Console.WriteLine($"{a}+{b}");
        }
        public int Sum(int a,int b)
        {
            return a + b;
        }
        public void Sum2<T>(T a, T b)
        {
            Console.WriteLine("{0} and {1}",a,b);
        }
        static public double Mul(double a , double b)
        {
            return a * b;
        }
    }
}

标签:委托,c#,System,new,泛型,using,方法
From: https://www.cnblogs.com/Amor-ztt/p/17290206.html

相关文章

  • openGauss备份恢复之gs_probackup
    一、概述1、基础信息gs_probackup是一个用于管理openGauss数据库备份和恢复的工具。它对openGauss实例进行定期备份,以便在数据库出现故障时能够恢复服务器。可用于备份单机数据库,也可对主机或者主节点数据库备机进行备份,为物理备份。可备份外部目录的内容,如脚本文件、配置文件、日......
  • 1130 -Host 'ip' is not allowed to connect to this MySQL server
      由于mysql默认不允许其他IP地址(非虚拟机)访问可以将访问的用户(如root)的host由localhost(本机)改成%(任意,也可指定ip)最后flushprivileges刷新权限 [root@hadoop4~]#mysql-uroot-pmysql>usemysql;mysql>selecthost,userfromuser;+-----------+------+|host......
  • rsync增量备份
    一、rsync远程同步1、什么是rsync远程同步rsync是C/S架构的数据镜像备份工具,可以实现全量备份和快速增量备份支持本地复制或ssh、rsync主机同步。rsync默认端口为873rsync特性:可以在不通主机之间镜像同步整个目录树,支持增量备份、保持链接和权限、时间、属性且传输前自动执行压......
  • UC384x
      ......
  • 2.Visual studio的使用和C++的基础
    visualstudio的基础介绍C++入门编程C++关键字、标识符C++基本数据类型变量的定义visualstudio的基础介绍解决方案资源管理器 也可以在”视图”中找到”解决方案资源管理器” “.h”:头文件;“.cpp”:源文件添加新建项,选择C++语言  运行程序,或"ctrl+F5“ ......
  • [FAQ] Pytorch PytorchStreamReader failed reading zip archive
     比如:rm-rf~/.cache/huggingface  Link:https://www.cnblogs.com/farwish/p/17290240.html......
  • 使用benchmark比较循环嵌套与strassen求解矩阵乘法的性能
    #include<benchmark/benchmark.h>#include<iostream>#include<random>#include<vector>usingnamespacestd;staticconstintn=200;staticconstint_lrange=0;staticconstint_rrange=10;staticconstint_iter=1;us......
  • win10+OpenCV4.7.0+cuda环境配置
    需要先安装和下载好以下文件vs2022CMake3.24.2opencv-4.7.0 GitHub-opencv/opencv:OpenSourceComputerVisionLibrary有时github上不去多刷新几次,久等一会儿,因为后续需要手动下载一些cmake不能下载的文件。opencv_contrib-4.7.0 GitHub-opencv/opencv_contrib:Rep......
  • C++中的左值和右值
    左值与右值左值和右值有如下3个规则:左值和右值都是表达式。左值是对象定位器,理论上左值指示指示一个对象。右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。http://c.biancheng.net/view/281.html左值:可以进行取地址的称为左值。右值:不......
  • LRU缓存替换策略及C#实现
    目录LRU缓存替换策略核心思想不适用场景算法基本实现算法优化进一步优化BenchmarkLRU缓存替换策略缓存是一种非常常见的设计,通过将数据缓存到访问速度更快的存储设备中,来提高数据的访问速度,如内存、CPU缓存、硬盘缓存等。但与缓存的高速相对的是,缓存的成本较高,因此容量往往是有......