这篇博客是在上篇的基础开始讲述了一下委托的一些用法,首先我举一个例子说明了一下前面章节的知识点,接下来我说了将方法作为参数传递的一个案例,接下来实现了一个委托实现冒泡排序的方法,如果你们和我一样正在学习,希望能够把代码详细的看一下,我感觉还是有帮助的,最后讲述一下回调函数的例子,学习编程做好的方法就是从代码中学习,所以我列举了很多代码,希望我们共同学习

1. 新建一个项目

(1)新建一个控制台项目,实现利用委托来实现多态的实现,

(2)委托可以将方法定义成变量来使用,所以可以实现统一调用不同实现

(3)举例说明一下:记得大学的时候老师让我们做过一个面试题,说是用委托实现如下功能,主人回家了,灯亮了,猫叫了,老鼠被逮着了,iphone5S出来了,有人有少肾了 ,下面我就写一下这道题的代码吧

 1   public delegate void FuncDelagete();
 2
 3     class Program
 4
 5     {
 6
 7         static void Main(string[] args)
 8
 9         {
10
11             Console.Write("请选择1:主人,2猫,3Iphone:");
12
13            //定义一个委托变量
14
15             FuncDelagete GetChoose;
16
17             //就是装配委托变量的方法
18
19             switch (Console.ReadLine())
20
21             {
22
23                 case "1":
24
25                     GetChoose = Master;
26
27                     break;
28
29                 case "2":
30
31                     GetChoose = Cat;
32
33                     break;
34
35                 case "3":
36
37                     GetChoose = Iphone;
38
39                     break;
40
41                 default:
42
43                     GetChoose = null;
44
45                     break;
46
47             }
48
49             //调用委托变量指向的方法,如果没有指向什么也不做
50
51             if (GetChoose != null)
52
53             {
54
55                 GetChoose();
56
57             }
58
59             Console.ReadKey();
60
61         }
62
63         public static void Master()
64
65         {
66
67             Console.WriteLine("主人回家了,灯亮了");
68
69         }
70
71         public static void Cat()
72
73         {
74
75             Console.WriteLine("猫叫了,老鼠被逮着了");
76
77         }
78
79         public static void Iphone()
80
81         {
82
83             Console.WriteLine("iphone出来了,有人有少肾了");
84
85         }
86
87     }

2. 将方法作为参数传递使用,先举个例子如下:

 1 public delegate void FuncDelegate();
 2
 3     class Program
 4
 5     {
 6
 7         static void Main(string[] args)
 8
 9         {
10
11             FuncDelegate myFunc = new FuncDelegate(Func);
12
13             Chinese(myFunc);
14
15             //等价于Chinese(Func);
16
17 //等价于Chinese(new FuncDelegate(Func));
18
19             Console.ReadKey();
20
21         }
22
23         //原始的,需要被当作参数来传递的
24
25         public static void Func()
26
27         {
28
29             Console.WriteLine("钓鱼岛是我们的,就是我们的参数,我们要传到中国去");
30
31         }
32
33         //传入什么方法,就直接执行这个方法
34
35         public static void Chinese(FuncDelegate target)
36
37         {
38
39             if (target != null)
40
41             {
42
43                 target();
44
45             }
46
47         }
48
49     }

//注:这只是一个演示的小案例,举得例子感觉有点不太好,但是因为这段时间是特殊日期吗,能看懂就行

说明:

(1) 将方法作为一个参数,传到另一个方法中执行,那么另一方法就可以作为一个执行的载体,他不管具体要干什么,只考虑自己的独有逻辑,可变化的方法有传入的方法执行

(2) 下面我们考虑这样一个练习:用冒泡对一个字符串进行排序,用数字的形式去排序,按照字符串的长度去排序,如果我们不使用委托事项的话我们的代码可以这样写,当然写出这个程序的代码很多,我就只按照我的写一遍

  1 class Program
  2
  3     {
  4
  5         static void Main(string[] args)
  6
  7         {
  8
  9             string[] strArr = { "232", "43", "65", "76", "87", "46" };
 10
 11             //用冒泡对这个字符串进行排序
 12
 13             //用数字的形式去排序
 14
 15             //按照字符串的长度去排序
 16
 17             OrderNum(strArr);
 18
 19             OrderString(strArr);
 20
 21
 22
 23             Console.ReadKey();
 24
 25         }
 26
 27         //按照数字的方式去排序
 28
 29         public static void OrderNum(string[] nums)
 30
 31         {
 32
 33             for (int i = 0; i < nums.Length - 1; i++)
 34
 35             {
 36
 37                 for (int j = 0; j < nums.Length - 1 - i; j++)
 38
 39                 {
 40
 41                     if (Convert.ToInt32(nums[j]) > Convert.ToInt32(nums[j + 1]))
 42
 43                     {
 44
 45                         string temp = nums[j];
 46
 47                         nums[j] = nums[j + 1];
 48
 49                         nums[j + 1] = temp;
 50
 51                     }
 52
 53                 }
 54
 55             }
 56
 57         }
 58
 59         //按照字符串的方式排序
 60
 61         public static void OrderString(string[] nums)
 62
 63         {
 64
 65             for (int i = 0; i < nums.Length - 1; i++)
 66
 67             {
 68
 69                 for (int j = 0; j < nums.Length - 1 - i; j++)
 70
 71                 {
 72
 73                     if (string.Compare(nums[j], nums[j + 1]) > 0)
 74
 75                     {
 76
 77                         string temp = nums[j];
 78
 79                         nums[j] = nums[j + 1];
 80
 81                         nums[j + 1] = temp;
 82
 83                     }
 84
 85                 }
 86
 87             }
 88
 89         }
 90
 91     }
 92
 93 下面我用方法传参的方式写一下上面所实现的代码:代码如下:
 94
 95 public delegate bool CompareDelegate(string s1,string s2);
 96
 97     class Program
 98
 99     {
100
101         static void Main(string[] args)
102
103         {
104
105             string[] strArr = { "232", "43", "65", "76", "87", "46" };
106
107             //用冒泡对这个字符串进行排序
108
109             //用数字的形式去排序
110
111             //按照字符串的长度去排序
112
113             Order(strArr, CompareNum);
114
115             Order(strArr, CompareString);
116
117             Console.ReadKey();
118
119         }
120
121         //通用方法对字符串数组进行排序,排序的规则有传入的方法决定
122
123         public static void Order(string[] nums,CompareDelegate target)
124
125         {
126
127             for (int i = 0; i < nums.Length - 1; i++)
128
129             {
130
131                 for (int j = 0; j < nums.Length - 1 - i; j++)
132
133                 {
134
135                     if (target(nums[j], nums[j + 1]))
136
137                     {
138
139                         string temp = nums[j];
140
141                         nums[j] = nums[j + 1];
142
143                         nums[j + 1] = temp;
144
145                     }
146
147                 }
148
149             }
150
151         }
152
153         //按照数字的方式去排序
154
155         private static bool CompareNum(string str1, string str2)
156
157         {
158
159             return Convert.ToInt32(str1) > Convert.ToInt32(str2);
160
161         }
162
163         //按照字符串的方式排序
164
165         private static bool CompareString(string str1, string str2)
166
167         {
168
169             return string.Compare(str1, str2) > 0;
170
171         }
172
173 }

->方法作为参数传递-回调函数

(1)在回调函数里面私有方法照样被访问,下面我们通过一个例子来说明一下,这段代码要仔细的看哦,

由于跳转的很厉害,所以看不懂的话可以加断点实验一下:

 1 public delegate void FuncDelagete();
 2
 3 class Program
 4
 5 {
 6
 7     static void Main(string[] args)
 8
 9     {
10
11         MyClassCol mc=new MyClassCol();
12
13         mc.Initialize();
14
15         mc.Run();
16
17         Console.ReadKey();
18
19     }
20
21 }
22 class MyClassCol
23
24 {
25
26     MyClass m;
27
28     public void Initialize()
29
30     {
31
32         m = new MyClass();
33
34         m.Target = Func;
35
36     }
37     public void Run()
38
39     {
40
41         m.Run();
42
43     }
44     private void Func()
45
46     {
47
48         Console.WriteLine("我是回调方法");
49
50     }
51
52 }
53
54 //这个类实现回调
55
56 class MyClass
57
58 {
59
60     FuncDelagete target;
61
62     public FuncDelagete Target
63
64     {
65
66         get { return target; }
67
68         set { target = value; }
69
70     }
71
72     public void Run()
73
74     {
75
76         if (target != null)
77
78         {
79
80             target();
81
82         }
83
84     }
85
86 }

转载于:https://www.cnblogs.com/czsl/archive/2012/09/17/2688355.html

c#委托与事件(二)相关推荐

  1. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

    一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...

  2. C#笔记(二):委托与事件

    本文内容: 1.  委托定义 2.  申明委托 3. 委托的实例化 4. 委托的调用 5. 匿名方法 6. 委托程序实例  7. 事件定义 8. 事件的申明 9. 事件的调用 10. 事件订阅与移除 ...

  3. js中的事件委托或是事件代理详解(转载)

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  4. C#综合揭秘——深入分析委托与事件

    引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单. 还将为您解释委托的协变与逆变,以及如何使用 Deleg ...

  5. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  6. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  7. 大白话系列之C#委托与事件讲解大结局

    今天是大白话系列之C#委托与事件讲解的大结局,也是我们最关心的,在日常的MES系统编程中到底怎样使用这样的利器,其实我们每天都在使用事件,一个窗体,一个按钮都包含这事件,只是很少用到自己写的委托和事件 ...

  8. 一个插排引发的设计思想 (三) 委托与事件

    一个插排引发的设计思想 (一) 观察者模式 一个插排引发的设计思想 (二) 抽象类与接口 一个插排引发的设计思想 (三) 委托与事件 ...待续.... 前两篇文章循序渐进的介绍了观察者模式.抽象类和 ...

  9. C#中在多个地方调用同一个触发器从而触发同一个自定义委托的事件

    场景 在Winfom中可以在页面上多个按钮或者右键的点击事件中触发同一个自定义的委托事件. 实现 在位置一按钮点击事件中触发 string parentPath = System.IO.Directo ...

  10. C#委托、事件、消息(入门级)

    本文的内容需要一定的OOP知识,不过我会在另一个内容介绍,由于实现细节,我会先写这部分. 大家关于委托.事件和消息大多是从WinForm编程接触的,首先是你在可视化的设计器里双击控件写所谓事件的处理代 ...

最新文章

  1. 简化可视SLAM应用程序的开发
  2. mac上使用crontab周期性执行python脚本
  3. 在node.js中一次读取一行文件?
  4. Linux中.a,.la,.o,.so文件的意义和编程实现
  5. easy ui example
  6. 国内外免费电子书(数学、算法、图像、深度学习、机器学习)
  7. iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
  8. 配置Tomcat的日志系统
  9. real time linux pdf,【整理】ubuntu real time Linux
  10. 鸿蒙一号指纹锁,【诉说实情】火车头战狼一号家用防盗门指纹锁怎么样?新手必看内情...
  11. 宝马 android手机同步,BMW将发布无线安卓互联系统,CarPlay终于不再一家独大!
  12. 转置卷积(Transposed Convolution)
  13. 无人车传感器 GPS 深入剖析
  14. 查询平均成绩最高的同学(MSSQL)
  15. mac 更新系统时间
  16. Windows10系统输入法切换使用全角和半角的方法
  17. 第一台计算机作文,精选电脑三年级作文6篇
  18. KubeFATE: 用云原生技术赋能联邦学习(一)
  19. 神起网络游戏如何推广代理?
  20. ‘UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 2: illegal multibyte sequence’

热门文章

  1. RPC 笔记(06)— socket 通信(多线程服务器)
  2. 2018 Google kickstart Problem A. Planet Distance
  3. CentOS 6.5 下配置Java环境
  4. TensorRT简介
  5. LeetCode简单题之连续字符
  6. 光谱投影颜色感知器件与围栅多桥沟道晶体管技术
  7. 人工智能芯片支持超低功耗器件的推理
  8. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)
  9. Python 爬虫框架Scrapy安装汇总
  10. Docker核心技术之容器与镜像深入了解