委托的多播

文章介绍了C#中如何使用+运算符合并委托,创建多播委托,以及如何通过-运算符移除合并中的组件委托。文中通过示例展示了无返回值和有返回值的委托多播,并指出在多播具有返回值的委托时,结果仅由最后一个方法决定。

1.委托对象可使用 + 运算符进行合并。

2. -运算符可用于从合并的委托中移除组件委托。

3.只有相同类型的委托可以被合并。

多播就是 委托1+委托2

 internal class Program
    {
        
        Action  action;// 无参数 无返回值
        Func<int> func; // 无参数有返回值
        static void Main(string[] args)
        {
            //    委托的多播
            //1.委托对象可使用 "+" 运算符进行合并。
            //2."-" 运算符可用于从合并的委托中移除组件委托
            //3.只有相同类型的委托可被合并
            Program program = new Program();
            //委托的多播
            program.action = ProgramMothod;
            program.action += ProgramMothod1;
            program.action += ProgramMothod2;
            program.action();
            program.action-= ProgramMothod1;
            //program.action();

            //多播具有返回值的 只会得到最后一个方法的结果
            program.func = ProgramMothod3;
            program.func += ProgramMothod4;
            program.func += ProgramMothod5;
            Console.WriteLine(program.func()); // 30
            Console.ReadKey();
            
        }

        public static void ProgramMothod() {
            Console.WriteLine(1);

        }
        public static void ProgramMothod1()
        {
            Console.WriteLine(2);

        }
        public  static void ProgramMothod2()
        {
            Console.WriteLine(3);

        }
        public static int ProgramMothod3()
        {
            return 10;

        }
        public static int ProgramMothod4()
        {
            return 20;

        }
        public static int ProgramMothod5()
        {
            return 30;

        }
    }

多播具有返回值的 只会得到最后一个方法的结果

### 委托的概念与用途 委托是一种引用类型,用于封装方法的引用,允许将方法作为参数传递、存储在变量中或从方法中返回。这种机制广泛应用于事件处理、回调函数、异步编程和代码模块化等场景。由于委托具有类型安全性,它比 C++ 中的函数指针更加安全可靠 [^2]。 在 C# 中,委托可以绑定到任何符合其签名的方法,这意味着方法必须具有相同的参数列表和返回类型。系统预定义了一些泛型委托类型,如 `Action<T>`、`Func<T, TResult>` 和 `Predicate<T>`,这些类型简化了常见的委托使用模式,无需手动声明新的委托类型 [^2]。 --- ### 委托的声明方式 声明一个委托需要指定其签名,即所引用的方法必须具有的参数列表和返回类型。基本语法如下: ```csharp public delegate void MyDelegate(string message); ``` 该语句定义了一个名为 `MyDelegate` 的委托类型,它可以引用一个接受字符串参数且没有返回值的方法 [^1]。 除了自定义委托外,还可以直接使用 .NET 提供的泛型委托类型,例如: ```csharp Action<string> printAction = Console.WriteLine; Func<int, int, int> addFunc = (a, b) => a + b; ``` 这些泛型委托提升了代码的复用性和可读性,减少了冗余的委托声明 。 --- ### 委托的实例化方法 委托可以通过多种方式进行实例化,包括使用构造函数、匿名方法和 Lambda 表达式。 **使用构造函数实例化:** ```csharp public delegate void MyDelegate(string message); public class Example { public static void MyMethod(string message) { Console.WriteLine(message); } public static void Main() { MyDelegate del = new MyDelegate(MyMethod); del("Hello, World!"); } } ``` **使用匿名方法实例化:** ```csharp MyDelegate del = delegate (string message) { Console.WriteLine(message); }; del("Hello, World!"); ``` **使用 Lambda 表达式实例化:** ```csharp MyDelegate del = (string message) => { Console.WriteLine(message); }; del("Hello, World!"); ``` 这些方式使得委托的使用更加灵活,适用于不同的编码风格和需求 [^3]。 --- ### 多播委托的实现 C# 支持多播委托(Multicast Delegate),即一个委托可以绑定多个方法,并按顺序依次调用它们。这种特性通常用于事件系统中通知多个监听者。 ```csharp public delegate void MyDelegate(string message); public class Example { public static void PrintMessage1(string message) { Console.WriteLine("PrintMessage1: " + message); } public static void PrintMessage2(string message) { Console.WriteLine("PrintMessage2: " + message); } public static void Main() { MyDelegate del1 = PrintMessage1; MyDelegate del2 = PrintMessage2; MyDelegate multiDel = del1 + del2; multiDel("This is a multicast delegate call."); } } ``` 在此示例中,`multiDel` 将会依次调用 `PrintMessage1` 和 `PrintMessage2` 方法。若需移除某个方法,则可使用 `-=` 操作符 [^2]。 --- ### 相关问题 1. 如何在 C# 中使用匿名方法或 Lambda 表达式绑定委托? 2. 委托与接口在功能设计上的区别是什么? 3. 在 Unity 中,委托是否可以跨多个场景使用?如何管理生命周期? 4. 如何避免委托引起的内存泄漏问题? 5. 什么是协变与逆变?它们在委托中的应用场景有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值