首页 > 其他分享 >多播委托

多播委托

时间:2024-12-06 11:34:59浏览次数:3  
标签:多播 Console 委托 void static byte

在C#中,多播委托(Multicast Delegate)是指可以关联多个方法的委托。

当调用一个多播委托时,它会依次调用与之关联的所有方法。

每个方法都会按照它们被添加到委托实例中的顺序执行。

多播委托必须具有void返回类型,因为如果委托有返回值,那么在调用多个方法时,无法确定应该返回哪个方法的结果。

下面是一个简单的例子,展示了如何定义和使用多播委托:

using System;

// 定义一个无参数且返回void类型的委托
public delegate void MultiCastDelegate();

class Program
{
    // 第一个要绑定到委托的方法
    static void Method1()
    {
        Console.WriteLine("Method One is called.");
    }

    // 第二个要绑定到委托的方法
    static void Method2()
    {
        Console.WriteLine("Method Two is called.");
    }

    // 第三个要绑定到委托的方法
    static void Method3()
    {
        Console.WriteLine("Method Three is called.");
    }

    static void Main(string[] args)
    {
        // 创建一个多播委托实例,并初始化为null
        MultiCastDelegate multiDelegate = null;

        // 使用 += 运算符将多个方法附加到委托上
        multiDelegate += Method1;
        multiDelegate += Method2;
        multiDelegate += Method3;

        // 调用多播委托,这将依次调用所有附加的方法
        multiDelegate(); // 输出: Method One is called.
                        //      Method Two is called.
                        //      Method Three is called.

        // 移除其中一个方法
        multiDelegate -= Method2;

        // 再次调用多播委托,这次不会调用Method2
        multiDelegate(); // 输出: Method One is called.
                        //      Method Three is called.
    }
}

多播委托的使用场景

1、事件处理
在GUI中,某个按钮点击可能需要触发多个响应方法。
例如,当点击“保存”按钮时,可能需要同时执行数据验证、数据保存和日志记录操作。可以使用多播委托将这些操作对应的方法添加到委托的调用列表中,当按钮被点击时(触发事件),这些方法就会依次被执行。

   // 定义一个委托类型
   delegate void ButtonClickHandler();

   class Button
   {
       private ButtonClickHandler clickHandlers;

       public void Click()
       {
           clickHandlers?.Invoke();
       }

       public void AddClickHandler(ButtonClickHandler handler)
       {
           clickHandlers += handler;
       }
   }

   class Program
   {
       // 用于标记数据是否有效
       static bool isDataValid = true;

       static void ValidateData()
       {
           // 模拟数据验证失败
           isDataValid = false;
           Console.WriteLine("Data validation failed.");
       }

       static void SaveData()
       {
           if (isDataValid)
           {
               Console.WriteLine("Saving data...");
           }
           else
           {
               Console.WriteLine("Data is invalid, cannot save.");
           }
       }

       static void LogAction()
       {
           if (isDataValid)
           {
               Console.WriteLine("Logging action...");
           }
           else
           {
               Console.WriteLine("Data is invalid, cannot log.");
           }
       }

       static void Main()
       {
           Button saveButton = new Button();
           saveButton.AddClickHandler(ValidateData);
           saveButton.AddClickHandler(SaveData);
           saveButton.AddClickHandler(LogAction);

           saveButton.Click();
       }
   }

2、消息广播
在分布式系统或基于消息的系统中,当一个消息到达时,可能需要多个模块或组件对该消息进行处理。多播委托可以用来实现消息的广播机制。

例如,在一个游戏服务器中,当一个玩家登录时,可能需要通知多个系统(如好友系统、成就系统、排行榜系统等)来更新相关数据。

   delegate void PlayerLoginHandler(string playerName);

   class GameServer
   {
       private PlayerLoginHandler loginHandlers;

       public void OnPlayerLogin(string playerName)
       {
           loginHandlers?.Invoke(playerName);
       }

       public void AddLoginHandler(PlayerLoginHandler handler)
       {
           loginHandlers += handler;
       }
   }

   class FriendSystem
   {
       public static void UpdateFriends(string playerName)
       {
           Console.WriteLine($"Updating friends for {playerName}");
       }
   }

   class AchievementSystem
   {
       public static void CheckAchievements(string playerName)
       {
           Console.WriteLine($"Checking achievements for {playerName}");
       }
   }

   class Program
   {
       static void Main()
       {
           GameServer server = new GameServer();
           server.AddLoginHandler(FriendSystem.UpdateFriends);
           server.AddLoginHandler(AchievementSystem.CheckAchievements);

           server.OnPlayerLogin("Player1");
       }
   }

3、数据处理管道
在数据处理应用中,可以使用多播委托构建数据处理管道。数据依次经过多个处理步骤,每个步骤由一个方法表示,这些方法通过多播委托连接在一起。

例如,在一个图像处理程序中,可能需要依次对图像进行降噪、锐化和色彩校正操作。

   delegate byte[] ImageProcessingHandler(byte[] imageData);

   class ImageProcessor
   {
       private ImageProcessingHandler processingHandlers;

       public byte[] ProcessImage(byte[] imageData)
       {
           return processingHandlers?.Invoke(imageData);
       }

       public void AddProcessingStep(ImageProcessingHandler handler)
       {
           processingHandlers += handler;
       }
   }

   class DenoiseFilter
   {
       public static byte[] Denoise(byte[] imageData)
       {
           Console.WriteLine("Applying denoise filter...");
           // 实际的降噪处理代码
           return imageData;
       }
   }

   class SharpenFilter
   {
       public static byte[] Sharpen(byte[] imageData)
       {
           Console.WriteLine("Applying sharpen filter...");
           // 实际的锐化处理代码
           return imageData;
       }
   }

   class ColorCorrectionFilter
   {
       public static byte[] ColorCorrect(byte[] imageData)
       {
           Console.WriteLine("Applying color correction...");
           // 实际的色彩校正代码
           return imageData;
       }
   }

   class Program
   {
       static void Main()
       {
           byte[] image = new byte[1024]; // 假设这是图像数据
           ImageProcessor processor = new ImageProcessor();
           processor.AddProcessingStep(DenoiseFilter.Denoise);
           processor.AddProcessingStep(SharpenFilter.Sharpen);
           processor.AddProcessingStep(ColorCorrectionFilter.ColorCorrect);

           byte[] processedImage = processor.ProcessImage(image);
       }
   }

标签:多播,Console,委托,void,static,byte
From: https://www.cnblogs.com/zeoHere/p/18590331

相关文章

  • C#委托的实例
    //命名委托//声明了一个委托,下一步需要实例化publicdelegatevoidMyDelegate();publicclassPerson{publicstaticvoidSayHello(){Console.WriteLine("HelloWorld");//委托实例化MyDelegateDale=newMyDelegate(SayHello);//调用Dal......
  • C#基础之委托,事件
    目录1委托1.1简介1.2操作使用1.2.1声明委托(Delegate)1.2.2实例化委托(Delegate)1.2.3直接调用和invoke1.2.4Invoke和BeginInvoke1.3委托的多播1.4委托的匿名和lambda1.4.1匿名方法1.4.2lambda表达式1.5内置委托1.5.1Action系列1.5.2Func系列1.5.3Predicate1.6示......
  • 玩转JavaScript事件委托,性能与效率双重提升
    玩转JavaScript事件委托,性能与效率双重提升前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。什么是事件委托?在现代JavaScript开发中,事件处理在使Web应用交互性和......
  • js中的事件委托
    事件委托就是使用事件冒泡机制将子元素相关事件绑定到父元素的处理方式。假设场景:当我们在开发过程中有toolbar功能开发,toolbar中每个按钮都会触发不同的相关功能(弹窗,左边栏,右边栏,跳转等),如果给每一个按钮绑定click事件,不仅代码量多,而且不方便维护,因此需要使用事件委托,将子元素所......
  • c#中的委托
    委托:delegate与类平级用于封装,解耦//声明一个委托delegatevoidFunc(intx);简单使用namespaceConsoleApp2;classProgram{/***委托*/publicdelegatedoubleCalculateFunction(doublex,doubley);/***加法*/......
  • 对委托和事件进行简单介绍
        对于委托和事件的使用较多的主要主要是回调函数、事件驱动编程、解耦代码、实现插件、实现回调接口。下面是一个简单的委托及事件的使用;//实例化对象Downloaddownload=newDownload();//订阅事件 --执行匿名函数download.downloadTaskEvent+=()=>{Conso......
  • 代理模式和委托模式有什么区别
    代理模式(ProxyPattern)和委托模式(DelegationPattern)在软件设计中都是常用的设计模式,但它们的目的和应用场景有所不同。1. 代理模式:目的:代理模式提供了一个代理对象来控制对原对象的访问。它在不直接访问实际对象的情况下,提供了对目标对象的间接访问。应用场景:常用于懒加载......
  • 事件和委托的悲伤故事
    小强的故事从前的从前,有一个村子,叫双空函数村,各个不同的函数相互帮衬,幸福而稳定的劳作着。虽然村子里每个函数都是空参空返回,但每个函数脑子里都装着不一样却一生注定的指令。(即程序开始编译之后)class双空血统(){publicvoid指令(){}//指令里的内容越多,实力越强}......
  • 阅读周·你不知道的JavaScript | 行为委托,搞懂对象之间的关系
    背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读两个月。《你不知道的JavaScr......
  • [JavaScript] 事件委托以及 Vue 列表循环事件绑定的性能优化
    前言事件委托(EventDelegation)是一种通过将事件监听器绑定到父元素,而不是直接绑定到每个子元素上的技术。这样可以减少事件监听器的数量,提升性能,并使得对动态添加或移除的元素更容易进行事件处理。事件冒泡和事件捕获事件冒泡:从里往外<divid="parent"style="padding:50px;......