委托(1)认识委托

  委托是.net中非常重要的特性,自.net 1.x版本就包含了,委托在项目开发过程中应用得非常多,但是一直以来很多同学对其理解得不是非常清楚(也包括我,虽然做开发很多年了,可能很多地方不知不觉也使用到了委托,但是仍然不是很清楚),那么我会整理一个系列文章来总结和加深一下对委托的印象。

什么是委托

可以用两点概括:

1,委托是一个类(class),可以通过查看IL代码证明。如下图。

2,委托包含的是具有相同签名,相同返回值类型的多个方法(也可以只有一个)。

从上图我们可以得到几点信息,1,委托就是一个类(class)。2,委托继承自System.MulticastDelegate类型。

为什么要使用委托

或者说使用委托能给我们带来什么好处,让人更容易理解吧。

下面通过一个小的例子来演示一下使用委托的好处。需求是,通过输入的name,控制台分别打印中文和英文的问候语。

不使用委托:

 1 namespace DelegateDemo
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //通过输入的name,控制台分别打印中文和英文的问候语
 8             Hello("麦子", Language.Chinese);
 9             Hello("mcgrady", Language.English);
10
11             Console.ReadKey();
12         }
13
14         /// <summary>
15         /// 问候
16         /// </summary>
17         /// <param name="name"></param>
18         /// <param name="lang"></param>
19         private static void Hello(string name, Language lang)
20         {
21             if (lang == Language.Chinese)
22             {
23                 ChineseHello(name);
24             }
25             if (lang == Language.English)
26             {
27                 EnglishHello(name);
28             }
29         }
30
31         /// <summary>
32         /// 中文问候
33         /// </summary>
34         /// <param name="name"></param>
35         private static void ChineseHello(string name)
36         {
37             Console.WriteLine(string.Format("你好,{0}", name));
38         }
39
40         /// <summary>
41         /// 英文问候
42         /// </summary>
43         /// <param name="name"></param>
44         private static void EnglishHello(string name)
45         {
46             Console.WriteLine(string.Format("hello,{0}", name));
47         }
48
49     }
50
51     /// <summary>
52     /// 语言类型
53     /// </summary>
54     public enum Language
55     {
56         English,
57         Chinese
58     }
59 }

不使用委托的时候,需要使用一个枚举Language来表示使用中文问候还是英文问候,并且还要进行if...else...的判断。

当可以直接传递方法的时候也许就简单多了,下面来看一下。

使用委托:

 1 namespace DelegateDemo
 2 {
 3     //声明委托
 4     delegate void MyDel(string name);
 5
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             //通过输入的name,控制台分别打印中文和英文的问候语
11             Hello("麦子", ChineseHello);
12             Hello("mcgrady", EnglishHello);
13
14             Console.ReadKey();
15         }
16
17         /// <summary>
18         /// 问候
19         /// </summary>
20         /// <param name="name"></param>
21         /// <param name="myDel"></param>
22         private static void Hello(string name, MyDel myDel)
23         {
24             myDel(name);
25         }
26
27         /// <summary>
28         /// 中文问候
29         /// </summary>
30         /// <param name="name"></param>
31         private static void ChineseHello(string name)
32         {
33             Console.WriteLine(string.Format("你好,{0}", name));
34         }
35
36         /// <summary>
37         /// 英文问候
38         /// </summary>
39         /// <param name="name"></param>
40         private static void EnglishHello(string name)
41         {
42             Console.WriteLine(string.Format("hello,{0}", name));
43         }
44
45     }
46 }

跟不使用委托相比,可以明显发现:

1,省去了if...else...的判断。

2,程序更面向对象了,也更具有扩展性了。后面如果再有日语,德语版本,直接传入德语的name和德语的Hello方法就可以了。

当然,这只是一个例子,目的是说明使用委托带来的好处,其实还有很多地方都使用到了委托,比如winform和webform的按钮click事件,Linq中的Func和Action委托等。

委托的应用场景

1,winform和webform的按钮click事件。

2,Linq中的Func和Action委托。

用XMind来总结一下:

时间: 2024-10-22 21:46:24

委托(1)认识委托的相关文章

委托+内置委托方法

委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后,创建该委托的实例. 定义委托的语法如下: delegate void IntMethodInvoker(int x); 定义了一个委托叫做IntMe

委托和多播委托

刚刚学习了委托的内容,先来说一下自己对委托的理解,权当是复习吧: 委托可以定义在类里面,也可以定义在类外面,如果定义在类里面就只能被这个类调用,不论声明它是public 还是private.如果定义在类外面就能被所有类调用.如果程序是多线程的,委托方法希望能在UI层调用,那么可以在命名空间下定义. //委托的声明 delegate关键字,这个委托只能代表返回值是空.参数是一个string类型的一个方法public delegate void GreetingDelegate(string nam

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { static void Main(string[] args) { } } } 使用Reflector查看委托的IL代码:○ 委托的确是一个类○ 委托的构造函数接收方法和类实例○ 而且是多播委托,可以用+=为委托变量赋值○ 委托内部使用Invoke方法触发方法○ BeginInvoke和EndInv

委托二--------使用委托实现冒泡排序

-------------------------------------------------------------Proson.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public class Proson     {  

委托三------------多播委托与匿名方法

============================================多播委托 -------------------------------------主程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 {     class Pr

个人总结:匿名委托+内置委托+Lambda表达式

匿名委托+内置委托+Lambda表达式 概要 在实际开发中,项目开发框架不同,用到的技术是不一样的,这里总结一下用Linq开发,ORM之EF开发会大量使用的Lambda表达式; 正文 之前提过.Net有一套扩展在IEumberable<T>泛型接口的扩展方法,本文是从这个基础继续总结; 1.void Action<in T>: 先拿一个ForEach()来讲: public void ForEach(Action<T> action); 这个Action<T>

.NET : Func委托和Action委托

上一篇我们讲到了如何在ASP.NET页面中实现异步任务.我们来回顾一下里面一个特殊的类型:LongTimeTask public class LongTimeTask{    public string Result = string.Empty;    public HelloWorldHandler handler; public delegate string HelloWorldHandler();    public string HelloWorld()    {        Th

C#中常见的委托(Func委托、Action委托、Predicate委托)

今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: (1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1); (3) *delegate TResult Func&