委托基础

本文深入解析C#中的委托概念,包括其定义、使用步骤及优势。通过实例展示如何声明、实例化并调用委托,同时探讨了委托在逻辑解耦和代码重用方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 什么是委托

        反编译之后,发现委托在IL中就是一个类,且继承自System.MulticastDelegate 特殊类,委托延迟了方法的调用,在C#中,委托无处不在

2 委托的初步使用

        委托的使用,跟类一样,有三步

        第一步 声明委托,委托既可以在类外声明,也可声明在类内

        第二步 实例化委托,参数为方法名,方法的参数与返回值必须与声明时指定的一致

        第三步 委托调用

using System;
using System.Runtime.CompilerServices;

namespace MyDelegate
{
    //类外声明
    //无参无返回值
    public delegate void NoReturnNoPara();  // 1 声明委托
    //有参无返回值
    public delegate void NoReturn(string name);
    class Program
    {
        //类内声明
        public delegate string NoPara();//无参有返回值
        public delegate string WithReturnWithPara(string name);//有参有返回值
        static void Main(string[] args)
        {
            NoReturnNoPara method = new NoReturnNoPara(Show);// 2委托实例化
            //两种方式调用
            method.Invoke();//3 调用
            method();
            Console.ReadKey();
        }

        public static void Show()
        {
            Console.WriteLine("Show");
        }
    }
}

3 委托的优势

     (1) 逻辑解耦 

      (2)代码重用

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;

namespace MyDelegate
{
    public class MultiBranch
    {
        
        /// <summary>
        /// 如果增加逻辑就要添加分支,
        /// 经常改动,不够稳定 难以维护
        /// </summary>
        /// <param name="name"></param>
        /// <param name="peopleType"></param>
        public void SayHi(string name, PeopleType peopleType)
        {
            Console.WriteLine("这里是.NetCore");
            switch (peopleType)
            {
                case PeopleType.Chinese:
                    Console.WriteLine($"{name}, 晚上好");
                    break;
                case PeopleType.American:
                    Console.WriteLine($"{name}, good evening");
                    break;
                case PeopleType.French:
                    Console.WriteLine($"{name}, bonjour");
                    break;
                default:
                    throw new Exception("wrong PeopleType");
            }
        }

        //增加分支就增加方法,不影响其他方法
        // 
        // 增加公共逻辑,那么每个方法都要改,有重复代码
        public void SayHiChinese(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, 晚上好");
        }
        public void SayHiAmerican(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, good evening");
        }
        public void SayHiFrench(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, bonjour");
        }
    }
    public enum PeopleType
    {
        Chinese,
        American,
        French
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace MyDelegate
{
    public delegate void SayHiDelegate(string name);
    public class DelegateTest
    {
        /// <summary>
        /// 既增加公共逻辑方便,又逻辑分离维护简单
        ///
        /// 逻辑解耦
        /// 代码重用
        /// </summary>
        /// <param name="name"></param>
        /// <param name="method"></param>
        public void SayHiPerfect(string name, SayHiDelegate method)
        {
            Console.WriteLine("这里是.NetCore");
            method.Invoke(name);
        }
        public void SayHiChinese(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, 晚上好");
        }
        public void SayHiAmerican(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, good evening");
        }
        public void SayHiFrench(string name)
        {
            Console.WriteLine("这里是.NetCore");
            Console.WriteLine($"{name}, bonjour");
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值