AI智能
改变未来

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)又出现了。(这里不说了)

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C#委托