首页 > 编程语言 >【C#学习笔记】C#中委托

【C#学习笔记】C#中委托

时间:2025-01-10 14:30:14浏览次数:3  
标签:委托 C# Image image 笔记 public handler void

概述

C#的委托是一种类型安全的函数指针,用于引用方法,委托允许方法作为参数传递,或者将方法赋值给委托变量,并通过委托调用方法。

委托类型:委托定义了方法的的签名([方法的参数类型和返回值]),所以,委托只能引用符合签名的方法。

委托实例:委托是一个引用类型,可以实例化并指向一个或多个符合委托签名的方法。

多播委托:C#支持将多个方法绑定到一个委托实例中,这种委托称为“多播委托”,可以依次调用这些方法。


委托声明

自定义委托的声明使用delegate关键字,类似于方法的签名,但是它是一个[类型],指定了返回值以及参数类型。

public delegate int CustomDelegate(int x,int y);

CustomDelegate是委托的类型,可以引用任何为 int Method(int x ,int y)的方法,注意返回值和参数类型要一致。


委托使用

以图片处理为例,假设封装了一个图片处理的SDK给三方做二次开发,如果三方想拓展图片处理的方法,使用委托方式更方便。

首先新建图片类。


  public class Image
  {
      string Name { set; get; }   
  }
  

处理图片的方法都放在ImageTools类中,封装成SDK给三方使用,有以下处理方法。

 public class Tools
 {
     public void ImageFilters(Image image)
     {
         Console.WriteLine("[工具箱]-添加滤镜");
     }

     public void AdjustColor(Image image)
     {
         Console.WriteLine("[工具箱]-调整颜色");
     }

     public void Beautification(Image image)
     {
         Console.WriteLine("[工具箱]-美颜");
     }

     public void ImageResize(Image image)
     {
         Console.WriteLine("[工具箱]-调整尺寸");
     }

     public void LoadImage(string name)
     {
         Console.WriteLine("[工具箱]-加载图片");
     }

     public void SavePhoto()
     {
         Console.WriteLine("[工具箱]-保存图片");
     }

 }

SDK中对图片处理的能力还是不够强大,比如对图片的旋转、图片压缩或者对图片格式的修改方法都没有提供。图片处理类中声明委托ImageProcessorHandler属性,在处理方法中作为形参传入。

//声明委托
public delegate void ImageProcessorHandler(Image image);

public class ImageProcessor
{

    public static void Process(Image image, ImageProcessorHandler processorHandler) {
        // processorHandler(image);    
          processorHandler.Invoke(image);       
    }

上述定义的委托格式ImageProcessorHandler(Image image),所以拓展方法只要按void Method(Image image)这种格式定义就可以轻松拓展其他图片处理方法。

internal class Program

{ 
    //三方拓展图片格式修改方法  
    private static void ChangeFormat(Image image) {
        Console.WriteLine("更改图片为png格式");
    }

    private static void Main(string[] args)
    {

        Image image = new();   
        
        Tools tools = new();
        tools.LoadImage("test.jpg");
		
		//调用SDK中默认的图片处理方法
        ImageProcessorHandler handler = tools.ImageFilters;
        handler += tools.ImageResize;
        handler += tools.Beautification;
        handler += tools.AdjustColor;
		
		//调用三方拓展方法
        handler += ChangeFormat;
        //图片处理
        ImageProcessor.Process(image, handler);
     	tools.SavePhoto();

    }
}

查看主函数中委托的调用,我们发现使用了+=运算符,说明一个委托可以指向多个方法,多个方法添加到委托实例中,委托会按照添加顺序依次执行,这就是委托的多播模式。

C#中也提供了一些内置的委托类型,常用的有System.ActionSystem.Func等。以System.Action为例

  //声明委托
  //public delegate void ImageProcessorHandler(Image image);

  public class ImageProcessor
  {
      public static void Process(Image image, Action<Image> processorHandler) {
          processorHandler.Invoke(image);             
      }
  }
  
 private static void Main(string[] args)
 {

     .....

     Action<Image> handler = tools.ImageFilters;
     handler += tools.ImageResize;
     handler += tools.Beautification;
     handler += tools.AdjustColor;

     handler += ChangeFormat;
	 .....

     ImageProcessor.Process(image, handler);

 }

委托与事件

事件是C# 中的一种特殊委托,它用于提供一种机制来实现发布-订阅模式,允许对象在某个条件或状态改变时通知其他对象。委托是事件的基础,事件相当于委托的封装。

标签:委托,C#,Image,image,笔记,public,handler,void
From: https://blog.csdn.net/qq_17470165/article/details/145057607

相关文章

  • OpenCV版本冲突解决
    前文提示,本文只是记录笔者成功的经历,方便笔者日后自行查看,故相对于其他文章并没有这么全面 推荐查看文章已放在文章末尾,推荐自行查看下载opencv源码https://opencv.org/releases/点进链接选择自己需要的版本即可(笔者使用的是3.4.5)问题描述笔者在编译开源代码时候,由于......
  • 根目录挂载,raid使用,bcache缓存策略
    一.了解挂载命令,常用的命令lsblk#查看磁盘blkid#查看磁盘的UUIDdd#拷贝磁盘命令使两块盘的UUID一致ddif=拷贝方of=被拷贝ddif=/dev/sda1of=/dev/sdb1#将sda1的数据拷贝到sdb1mount/dev/sda/home配置系统前给主机添加磁盘并配置reid二.三.reid完成......
  • C++ 中使用预取指令可以帮助减少缓存未命中的延迟
    在C++中使用预取指令可以帮助减少缓存未命中的延迟,从而提高程序性能。以下是如何在代码中实现预取的详细步骤和示例。1.理解预取指令预取指令允许CPU提前加载数据到缓存中,从而在需要时可以更快地访问。这在处理大量数据时特别有用。例如,SSE2提供了_mm_prefetch指令。2.......
  • 在c++代码怎么实现数据对齐
    在C++中实现数据对齐可以通过以下几种方法:1.使用alignas关键字C++11引入了alignas关键字,可以用来控制变量的对齐方式。#include<iostream>#include<emmintrin.h>//SSE2alignas(16)floata[4]={1.0f,2.0f,3.0f,4.0f};alignas(16)floatb[4]={5.0f,6.0......
  • 使用 `rsync + inotify` 实现实时文件同步:简单又高效
    使用rsync+inotify实现实时文件同步:简单又高效在日常的运维工作中,文件的实时同步是一个非常常见的需求,比如:网站更新:同步静态资源到多台服务器。备份数据:将生产数据实时备份到异地存储。日志传输:将日志实时同步到集中分析服务器。为了高效实现这些需求,我们可以将强大......
  • C3工具
    1、安装rpm-ivh--forcec3-5.1.2-1.noarch.rpmyuminstall-yexpect-5.44.1.11-1.241.1.x86_64.rpm2、配置sshd互信catipList.cnf10.0.0.2610.0.0.2710.0.0.28shGbase_03_Tool_SSHNoPassLogin.shroot1234563、C3配置clustercoor#cluster主机配置......
  • 【JPCS出版,快速见刊检索】2025年可再生能源与节能国际会议(REEC 2025)
    2025年可再生能源与节能国际会议(REEC2025)将在2025年3月7-9日于中国江西新余召开。大会旨在为从事可再生能源与节能方面的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨,促进学术成果产业化合作的平台。......
  • 2025最新超详细PycharmIDE安装配置完整版教程(详细步骤)
    包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】!1PyCharm下载PyCharm的下载安装非常简单,可以直接到Jetbrains公司官网下载,具体步骤如下:(1)打开Pycharm官网[http://www.jetbrains.com,选择Tools菜单下的PyCharm项,如图1所示,进入下载PyCharm界面。]图1......
  • SpringCloud微服务(十二)
    前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 往期目录回顾: SpringCloud微服务(一)SpringCloud微服务(二)SpringCloud微服务(三)SpringCloud微服务(四)SpringCloud微服务(五)SpringCloud微服务(六)SpringCloud微服务(七)SpringClo......
  • Java 实现 Elasticsearch 查询当前索引全部数据
    Java实现Elasticsearch查询当前索引全部数据需求背景通常情况Java实现查询Elasticsearch全部数据写在最后需求背景通常情况下,Elasticsearch为了提高查询效率,对于不指定分页查询条数的查询语句,默认会返回10条数据。那么这就会有一种情况,当你需要一次性返回Ela......