C#委托零基础理解
C#委托零基础理解(转)
1, 为什么使用委托 2.什么是委托 3.委托如何使用
为什么使用委托?
委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
什么是委托?
委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值。
如何使用委托
下面咱们就抛开枯燥的概念,来看几个活生生的例子是怎么使用委托的吧!
案例1:中国人和英国人问好
分析:1.首先我们需要编写一个中国人问好的方法和一个英国人问好的方法。
2.编写一个Greet方法,将问好方法作为一个参数,实现各个国家人的问好方法。
3.使用委托实现各个国家人的问好功能
使用委托分为三个步骤:1,定义委托 2.声明委托变量 3.使用委托
// 1.定义委托
public delegate void GreetDelegate(string name);
class Program
{
static void Main(string[] args)
{
//2.声明委托变量
GreetDelegate dDelegate = new GreetDelegate(ChineseGreeting);
//3.使用委托
dDelegate("李小龙");
Console.ReadKey();
}
//中国人问好方法
public static void ChineseGreeting(string name)
{
Console.WriteLine("早上好!" + name);
}
//英国人问好方法
public static void EnglishGreeting(string name)
{
Console.WriteLine("Morning!" + name);
}
public static void Greet(string name, GreetDelegate makeGreet)
{
makeGreet(name);
}
}
为了加深大家对委托的理解,我们再来写一个相似的例子。
案例2:翻译案例:通过委托将英文翻译为中文和韩文
//01.声明一个委托类
public delegate void MyTransDelegate(string words);
class Program
{
static void Main(string[] args)
{
//翻译方法
//调用方法一
//2.声明委托
MyTransDelegate del=new MyTransDelegate(TransToCN);
//3.调用委托
del("aa");
//调用方法二
Translate("aa",TransToCN);
//调用方式三
//MyTransDelegate del = TransToCN;
//del("aa");
Console.ReadKey();
}
static void Translate(string str,MyTransDelegate del)
{
del(str);
}
static void TransToCN(string str)
{
Console.WriteLine("翻译成中文了!");
}
static void TransToKorean(string str)
{
Console.WriteLine("翻译成韩语了!");
}
}
通过这个案例,我们可以看出使用委托的方法不止一种,无论使用哪种方式,最终都和方式一一样。通过反编译我们可以证明:
如下图示我通过反编译看到方法二的代码:
如下是反编译后方法三的代码
有了上述知识存储,我们再来看一个案例:
案例3:通过委托将子窗体中的值传递到父窗体中
如图有父窗体和子窗体两个窗体,现在我想实现当点击父窗体中按钮时弹出子窗体(当然这个超级简单),在弹出子窗体后,在子窗体的文本框中输入内容,点击关闭按钮后子窗体关闭,并且将子窗体中输入的内容在父窗体的文本框中显示。
子窗体中代码如下:
//定义委托
public delegate void Words(string words);
//声明委托变量
public Words words;
private void button1_Click(object sender, EventArgs e)
{
words(txtchild.Text);
this.Close();
}
父窗体中的代码:
private void btnOpen_Click(object sender, EventArgs e)
{
Child child = new Child();
child.words = GetWords;
child.Show();
}
public void GetWords(string str)
{
txtMain.Text = str;
}
我们来分析下上述两断代码:
首先,我们想在子窗体关闭时,更新父窗体文本框中的数据。但是我们非常清楚的知道,窗体之间的空间是不能直接相互访问的,这时我们就要找一个中介帮我们实现父窗体数据的更新功能。于是我们定义了带一个参数没有返回值的委托Words,并且在父窗体中定义了一个方法GetWords符合委托的条件。于此同时,在子窗体中声明了一个委托变量words,并且在关闭按钮中,调用了委托变量。
但在子窗体中我们没有对子窗体委托变量赋值,真正的赋值放到了主窗体中。这样通过委托就实现了在子窗体中调用父窗体的方法,进而实现了父窗体文本框内容的更新。
不知道,看过上述3个案例,大家对委托有没有一个相对清晰的认识,如果本文能帮助迷途中的你,那就更好了。
C#委托零基础理解的更多相关文章
- .NET零基础入门05:委托与事件
一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...
- 《iOS开发指南:从零基础到App Store上架(第2版)》
<iOS开发指南:从零基础到App Store上架(第2版)> 基本信息 作者: 关东升 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115348029 上架时间:201 ...
- 辛巴学院-Unity-剑英陪你零基础学c#系列(四)函数和封装
辛巴学院:正大光明的不务正业. 国庆长假结束了,我的心情是这样的: 你总是起不早,起不早独自一个人沉睡到天亮你无怨无悔的梦着那副本我知道你根本就不想上班你总是起不早,起不早放假总是短暂,上班太难请个病 ...
- 零基础如何学习java更有效呢?
零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- CSS零基础学习笔记.
酸菜记 之 CSS的零基础. 这篇是我自己从零基础学习CSS的笔记加理解总结归纳的,如有不对的地方,请留言指教, 学前了解: CSS中字母是不分大小写的; CSS文件可以使用在各种程序文件中(如:PH ...
- Yaf零基础学习总结3-Hello Yaf
Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Y ...
- MongoDB实战开发 【零基础学习,附完整Asp.net示例】
MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...
随机推荐
- python(15)提取字符串中的数字
python 提取一段字符串中去数字 ss = “123ab45” 方法一:filter filter(str.isdigit, ss) 别处copy的filter的用法: # one>> ...
- 【Java】图片高质量缩放类
package com.test; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg. ...
- Hbase原理
Hbase原理 概述 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google BigTable模型开发的,典型的key/value系统:HBase是Apache Hadoop ...
- unity jiaoben
transform.Translate(Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 移动 transform.Translat ...
- gridview转成EXCEL文件保存(多页)
CompositeLink complink = new CompositeLink(new PrintingSystem()); PrintableComponentLink link = new ...
- Oracle常用命令1
一. 安装是用户管理: sqlplus /nolog; connect /as sysdba; alter user sys identified by change_on_install; alte ...
- MSSQL中的随机函数
随机函数:rand()在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会 ...
- 326.Power of Three
/* Given an integer, write a function to determine if it is a power of three. Follow up: Could you d ...
- ipv6 测试
# ifconfig wlp0s29f7u6: .... ... inet6 fe80::a00:20ff:fe9d:5c55 prefixlen 64 scopeid 0x20<link> ...
- OC基础(11)
构造方法 自定义构造方法 继承中的自定义构造方法 自定义类工厂方法 *:first-child { margin-top: 0 !important; } body > *:last-child ...