C#委托

什么是委托
先不提委托的那些概念,我们先来从简单的生活实例出发来理解和认识委托。
比如说有个叫小明的同学,他现在在喝茶但同时他又在读书。我们可以简单的用两个函数来来描述这个状态。

class  Program
    {
        public static void Drinking(string name) 
        {
            Console.WriteLine(name+" 在喝茶" );
        }
        public static void Reading(string name) 
        {
            Console.WriteLine(name+" 在读书");
        }
        static void Main(string[] args)
        {
            Program program=new Program();
            program.Drinking("小明");
            program.Reading("小明");
            Console.ReadLine();
        }
    }

这就可以表示小明在同一时刻的状态,但是小明此时肯定不止这些状态或者某些状态已经没了,比如他的脚放在桌上了等等。那么我们照着这种方法岂不是要重新写函数,然后在下面一句句的输出或者删除某些函数和下面的某些输出语句。显然这种解决方案的可扩展性很差,那么是时候改进一下了。

面向对象设计,讲究的是对象的封装。我们可以再写一个类去包含这些方法,这就比上一个程序好些了,但是你会发现这还不是写函数和一个个调用吗,本质上没什么变化嘛。好那我们就想如何解决这种问题,比如我们可不可以写一个方法包含以上描述状态的所有方法呢,以后我们只需要对它进行操作就可以了,如果能,又该如何写?对这个函数又该如何操作?这时我们便急需一种解决的办法————-它就是委托。

具体是怎么解决这个问题的呢,也就是等同于委托有什么用,怎么用。先说思路,我们可以把这些描述状态的函数用一个东西来描述,最好是什么呢,构造一个新函数,新函数不是有形参吗,把这些状态函数用形参表示,然后也能够对一个函数进行我们熟悉的操作不就达到目的了吗。(* ^ *)

委托正是实现这一需求的有效办法。委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,使得程序具有更好的可扩展性。当然一个变量时不太明显看出委托的优点,当变量很多时你就可以感知到了,因为你每个变量都要处理,不得不使用switch,if-else等语句,太冗杂了,自己痛苦别人也痛苦。

委托怎么写

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

namespace Delegate
{
    public delegate void DoDelegate(string name);  //定义委托,它定义了可以代表的方法的类型
    public class DoManager 
    {
        public DoDelegate delegate1;
        public void Do(string name) 
        {
            delegate1?.Invoke(name);    //有方法注册委托变量,就通过委托调用方法
        }
    }
    class Program
    {
        public static void Drinking(string name) 
        {
            Console.WriteLine(name+" 喝茶" );
        }
        public static void Reading(string name) 
        {
            Console.WriteLine(name+" 读书");
        }
        static void Main(string[] args)
        {
            DoManager doManager = new DoManager();
            doManager.delegate1 = Drinking;
            doManager.delegate1 += Reading;
            doManager.Do("小明" );
            Console.ReadLine();
        }
    }
}


声明和定义委托分为4个步骤:
1.声明一个委托

public delegate void DoDelegate(string name);

2.创建委托对象

public DoDelegate delegate1;

3.创造符合委托格式的函数。

public void Do(string name){ }

4.将函数名称赋值给委托

doManager.delegate1 = Drinking;

以上就是委托的声明定义以及使用方法,你可以结合上面的代码自己操作一下。

另外还有几点强调补充: 委托是个类,跟(String str;)这种语句是一个用法。比如private static void Do(string name,DoDelegate delegate1) { delegate1 (name); }

委托就相当于C,C++里面的指针,声明一个委托相当于声明一个函数指针,创造一个符合委托格式的函数就相当于指针指向一个函数。

在上面的代码中,delegate1和我们平时用的string类型的变量是一样的,但是并不是所有的字段都应该声明成public,合适的做法是应该public的时候public,应该private的时候private。声明委托的目的就是为了把它公开在类的客户端进行方法的注册,如果声明为private了,客户端是不会识别它的,委托就什么也不是了。如果声明为public,在客户端可以对它进行随意的赋值,方法的绑定等操作,严重破坏对象的封装性。因此,事件(event)又出现了。(这里不说了)

以上就是我对委托的一点认识,不知道说清楚没有,也不知道说的是否准确,欢迎各位批评指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值