当前位置: 首页 > 编程日记 > 正文

c#委托与事件(二)

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

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

相关文章:

互联网公司java面试题(一)

1、JDK和JRE区别&#xff1f; JDK是整个JAVA的核心&#xff0c;包括了Java运行环境JRE&#xff0c;一堆Java工具和Java基础的类库。通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 件)。JRE是Java运行环境&#xff0c;不含开发环境&#xff0c;即没有编译器和调…

python属于哪种类型的语言_Python是什么类型的编程语言,有什么特性

由于近几年人工智能的不断发展&#xff0c;Python也跟着火了&#xff0c;因为Python是深度学习技术的主流应用编程语言。同时它的应用场景很多&#xff0c;被称为“胶水语言”。下面给大家科普一下Python这门神奇的编程语言&#xff0c;以及语言特性&#xff0c;帮大家更清晰的…

Linux下C语言线程池的实现(1)

http://hi.baidu.com/lingiloveyou/blog/item/21e57cf3322a6b40342accc7.html 什么时候需要创建线程池呢&#xff1f;简单的说&#xff0c;如果一个应用需要频繁的创建和销毁线程&#xff0c;而任务执行的时间又非常短&#xff0c;这样线程创建和销毁的带来的开销就不容忽视&am…

一篇简单易懂的原理文章,让你把JVM玩弄与手掌之中

jvm原理 Java虚拟机是整个java平台的基石&#xff0c;是java技术实现硬件无关和操作系统无关的关键环节&#xff0c;是java语言生成极小体积的编译代码的运行平台&#xff0c;是保护用户机器免受恶意代码侵袭的保护屏障。JVM是虚拟机&#xff0c;也是一种规范&#xff0c;他遵循…

python代码画皮卡丘_Python气象绘图实例我们一起画台风(代码+数据)

前段时间袭击中国的超强台风“利奇马”&#xff0c;以及这两天袭击美国的五级飓风“多利安”&#xff0c;让我们感受到了大自然的力量。所以&#xff0c;今天分享一个简单的Python实例&#xff0c;也算是延续前面python气象绘图系列(点击链接1&#xff1b;点击链接2)&#xff0…

Windows Socket编程笔记之最简单的小Demo

Windows Socket编程的大致过程:服务器端:----过程-------------对应的API------- 0.初始化 | WSAStartup() 1.创建Socket | socket() 2.绑定Socket | bind() 3.监听 | listen() 4.接受连接 | accept() 5.接收/发送数据 | recv()/send()…

React项目实战

一、环境搭建 1.安装react-cli脚手架&#xff08;保证提前安装好Node最新版本&#xff09; npm config set registry http://registry.npm.taobao.org/ npm config set sass-binary-site http://npm.taobao.org/mirrors/node-sass npm isntall -g create-react-app 2.查看react…

win7完美兼容DynamipsGUI(小凡模拟器)攻略

博主又是好久没写了&#xff0c;今天闲来无事与大家一起分享一下如何在windows7平台下完美兼容DynamipsGUI&#xff08;小凡模拟器&#xff09;的一个小窍门~ 对于学习cisco的朋友来说&#xff0c;DynamipsGUI&#xff08;小凡模拟器&#xff09;一定不陌生&#xff0c;在这就不…

使用PHPExcel 对表格进行,读取和写入的操作。。。。

下面的代码是使用PHPExcel 对多个表格数据进行读取&#xff0c; 然后整合的写入新的表格的方法&#xff01;&#xff01;&#xff01;代码有点粗糙 &#xff0c; 多多保函&#xff01;&#xff01;&#xff01; 这里有些地方注意下&#xff0c;如果你的表格数据过大&#xff0c…

c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...

“System.IO.FileLoadException”类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对“v2.0.50727”版的运行时生成的&#xff0c;在没有配置其他信息的情况下&#xff0c;无法在 4.0 运行时中加载该程序集。 这时需要改dbconfig配置 在configuration 节点…

python多线程并发_Python进阶记录之基础篇(二十四)

回顾在Python进阶记录之基础篇(二十三)中&#xff0c;我们介绍了进程的基本概念以及Python中多进程的基本使用方法。其中&#xff0c;需要重点掌握多进程的创建方法、进程池和进程间的通信。今天我们讲一下Python中的多线程。线程的基本概念线程是操作系统能够进行运算调度的最…

awk处理文件内容格式

今天运营出了点问题&#xff0c;需要对特定时间段充值数做一个处理&#xff0c;文件格式有特定要求&#xff0c;要符合erlang的格式{roleID,gold}.mysql导出所有数据结果如下【取部分数据看】&#xff1a;kuwo 4 50004106230500 100kuwo 4 50004106230900 …

QQ远程协助没动静?QQ版本有讲究

一位网友觉得电脑反应速度慢了&#xff0c;想通过QQ远程协助让我处理一下。不料接受请求后&#xff0c;等了许久都显示网友电脑的桌面&#xff0c;而网友那边QQ也没有任何提示。 反复尝试了几次都是如此。 询问网友得知他用的QQ为2011版&#xff0c;而我使用的QQ是2008版。难…

java课堂测试样卷-----简易学籍管理系统

程序设计思路&#xff1a;分别建立两个类&#xff1a;ScoreInformation类(用来定义学生的基本信息以及设置set和get函数&#xff09;ScoreManagement类&#xff08;用来定义实现学生考试成绩录入&#xff0c;考试成绩修改&#xff0c;绩点计算等功能的函数&#xff09;和一个主…

python3安装setuptools步骤_setuptools、pip的安装

第2篇分享 安装setuptools 下载setuptools源码setuptools-25.2.0.tar.gz选择需要的版本 这是一个压缩文件&#xff0c;将其解压到桌面&#xff0c;并进入该文件夹 按住shift键后&#xff0c;在文件夹空白处点击鼠标右键&#xff0c;选择&#xff1a;在此处打开命令窗重点&#…

如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本

等下要去坐车&#xff0c;今天就不继续唠叨开发过程了&#xff0c;来谈一下普遍比较关心的后台语言问题。学习Ext JS&#xff0c;笔者一直强调学习的中心思路是“界面与数据是分离”。只要好好掌握这个思路&#xff0c;深入了解Ext JS的运作过程&#xff0c;就不会为后台语言使…

[面试]future模式

Future模式 什么是future模式? 传统单线程环境下&#xff0c;调用函数是同步的&#xff0c;必须等待程序返回结果后&#xff0c;才可进行其他处理。 Futrue模式下&#xff0c;调用方式改为异步。 Futrue模式的核心在于&#xff1a;充分利用主函数中的等待时间&#xff0c;利用…

java ide

tidespringsource sts a vmware product plugin:Aptana Studio 3(集成了Git) Run on Jettyeclipse for jee plugin:JBoss Tools,m2eclipe,spirng tools,svn

成长秘笈:是你教我,不是我教你

郑昀 20180622 “谢谢你&#xff0c;你是第一个面试的时候跟我说这么详细的。那我到你们公司之后怎么就能成长了呢&#xff1f;” “你们这些人最大的问题是出不了方案。 为什么出不了方案&#xff1f; 因为没有养成深度思考问题的习惯。 实现方案、算法、数据迁移、准备数据、…

计算机网络面试题(一)

1、OSI&#xff0c;TCP/IP&#xff0c;五层协议的体系结构&#xff0c;以及各层协议 OSI分层 &#xff08;7层&#xff09;&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层&#xff08;4层&#xff09;&#xff1a;网络接口 网络层、运…

Ubuntu下安装和配置Apache2

在Ubuntu中安装apache 安装指令&#xff1a;sudo apt-get install apache2 安装结束后&#xff1a; 产生的启动和停止文件是&#xff1a;/etc/init.d/apache2 启动&#xff1a;sudo apache2ctl -k start 停止&#xff1a;sudo apache2ctl -k stop 重新启动&#xff1a;sudo apa…

苹果电脑安装python3密码_mac系统安装Python3初体验

前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7。 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 Xcode command line tool 1.2.1 打开命令行terminal工具 control space 输入terminal 回车 1.2.2 安装Xcode command line tool…

【IBM Tivoli Identity Manager 学习文档】3 系统部署

作者&#xff1a;gnuhpc 出处&#xff1a;http://www.cnblogs.com/gnuhpc/ ITIM 5.0 单服务器配置和部署。 部署ITIM之前要对其组件进行部署&#xff1a; IBM DB2 Enterprise 9.1 with FP2 IBM WebSphere Application Server 6.1 with FP9 IBM Tivoli Directory Server 6.2 IB…

数据结构Java版之红黑树(八)

红黑树是一种自动平衡的二叉查找树&#xff0c;因为存在红黑规则&#xff0c;所以有效的防止了二叉树退化成了链表&#xff0c;且查找和删除的速度都很快&#xff0c;时间复杂度为log(n)。 什么是红黑规则&#xff1f; 1.根节点必须是黑色的。 2.节点颜色要么是红要么是黑。 3.…

你真的了解Grid布局吗?

Grid网格布局 概述&#xff1a;Grid将容器划分为一个个网格&#xff0c;通过任意组合不同的网格&#xff0c;做出你想想要的布局 Grid与flex布局相似&#xff0c;将整个Grid分为了容器与子项&#xff08;格子&#xff09; Grid容器的三个重要的概念&#xff1a; 行和列单元格网…

webform里的验证控件

1.非空验证控件&#xff1a;RequireFieldValidator &#xff1b;2.数据比较验证&#xff1a;CompareValidator &#xff1b;3.数据范围验证&#xff1a;RangeValidator &#xff1b;4.正则表达式验证&#xff1a;RegularExpressionValidator &#xff1b;5.自定义条件验证&…

hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...

1. 什么是进程一个软件&#xff0c;在操作系统中运行时&#xff0c;我们称其为进程。进程是操作系统分配资源的最小单元&#xff0c;线程是操作系统调度的最小单元。2. 什么是线程在一个进程中&#xff0c;每个独立的功能都需要独立的去运行&#xff0c;这时又需要把当前这个进…

WinXP不能共享Win7的打印机的解决方法

现在很多企业里存在着WinXP和Win7混用&#xff0c;WinXP不能正常共享Win7的文件和打印机&#xff0c;经过设置发现Win7可以Ping通Winxp并且也可以发现WinXP的共享文件&#xff0c;可是WinXP却不能共享Win7的文件和打印机&#xff0c;看了一下相关资料后简单设置就解决了这个问题…

第三阶段 10_JavaWeb基础_

因为要准备接本&#xff0c;不一定能够每天更新 转载于:https://www.cnblogs.com/BaiZe258/p/9251075.html

工厂模式(Factory)(转)

先来明确一个问题&#xff0c;那就是有的时候&#xff0c;实例化这个活动不应该总是公开的进行&#xff0c; 也就是不要公开的使用 new 操作符&#xff0c;因为&#xff0c;这样容易造成耦合问题。 我们不应该针对实现编程&#xff0c;但是当我们在使用 new 的时候&#xff0c;…