03.C#委托(二章1.1)
一章1.5-1.8介绍的是com、动态类型及.NET平台一些说明,每个心中都有自己的标准,听一家之言,叫人不爽,相信自己有自己的标准和自己的编程理念就OK了,也不想码那么多说明性的文字,直接跳过吧,当然自己还是看过了。进入正题,这篇来说一下委托(在深入理解C#的同时,我也在学C++,委托确实和函数指针有相似的地方,大家也可以去了解下。)
委托的四个基本构成:
- 委托类型的声明
- 满足委托类型签名的方法
- 委托类型实例
- 调用委托实例
声明委托使用delegate关键字
public delegate void Drive(string name);
如上,声明了一个委托类型Drive,由System.MulticastDelegate派生,而System.MulticastDelegate又是继承于System.Delegate,该类型有自己的方法和属性。与该类型匹配的方法的签名必需使用一个string类型作为参数和返回一个void类型(即不返回),可以是静态方法或者一个实例方法。
public class Car
{
//实例方法
public void Drive(string name)
{
Console.WriteLine(name + "正在开车!!!");
} //静态方法
public static void StaticDrive(string name)
{
Console.WriteLine(name + "正在开车!!!");
}
}
如上,Car类中的Drive方法是一个实例方法,使用该方法前要有一个Car类型的实例,StaticDrive是一个静态方法,使用类作用域便可以调用,且上述两个方法的签名均满足上述委托对于方法签名的要求。
接下来要创建一个Drive类型的委托实例,并且去调用。
class Program
{
static void Main(string[] args)
{ //声明两个委托实例
Drive drive0, drive1;
Car car = new Car(); //对委托实例进行赋值,一个使用静态方法,一个使用实例方法
drive0 = new Drive(Car.StaticDrive);
drive1 = new Drive(car.Drive); //调用委托实例方法 //使用委托实例中的Invoke方法进行调用
drive0.Invoke("Leo");
//使用简写方法
drive1("DuDu"); Console.ReadKey(); }
}
上术只是对一个简单操作的调用,委托更多的情况使用于多个操作联合使用。可以使用Delegate.Combine和Delegate.Remove对操作的增减,一般使用简写方式+=和-=。
class Program
{
static void Main(string[] args)
{ //声明两个委托实例
Drive drive0, drive1;
Car car = new Car(); //对委托实例进行赋值,一个使用静态方法,一个使用实例方法
drive0 = new Drive(Car.StaticDrive);
drive1 = new Drive(car.Drive); //调用委托实例方法 //使用委托实例中的Invoke方法进行调用
drive0.Invoke("Leo");
//使用简写方法
drive1("DuDu"); drive0 += drive1;
drive0.Invoke("Leo"); Console.ReadKey(); }
}
运行结果如下:
使用+=或者-=操作能更加方便,且利于理解。
03.C#委托(二章1.1)的更多相关文章
- PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- X32位 天堂2 二章/三章 服务端协议号修改方法
[本方法适合于2004-2006年之间天堂2由初章服务端修改至二章.三章端时协议号匹配问题]服务端版本位32位初章服务端 目前大部分SF用的协议号情况: 服务端是419 客户端是 417 419 42 ...
- 《利用python进行数据分析》读书笔记 --第一、二章 准备与例子
http://www.cnblogs.com/batteryhp/p/4868348.html 第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得 ...
- <构建之法>第十一章、十二章有感
十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- [CSAPP笔记][第十二章并发编程]
第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...
随机推荐
- python 解析json loads dumps
认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...
- UVALive 6073 Math Magic
6073 Math MagicYesterday, my teacher taught us about m ...
- mybatis的#{}和${}的区别以及order by注入问题
前言略,直奔主题.. #{}相当于jdbc中的preparedstatement ${}是输出变量的值 你可能说不明所以,不要紧我们看2段代码: String sql = "select * ...
- 移动web在ios和android下点击元素出现阴影问题
移动web开发经验总结 1.-webkit-tap-highlight-color:rgba(255,255,255,0)可以同时屏蔽ios和android下点击元素时出现的阴影.备注:transp ...
- listview中OnItemClick方法各个参数的作用
OnItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 1.arg0,arg2 m_listview.setOnI ...
- bfs简单题-poj2251
宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...
- android调试模拟器启动太慢,怎样才能更快的调试程序呢?
答: 1. 模拟器不关,直接按调试按钮系统会自动重新安装软件的.
- Fidder--实现手机的抓包
今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...
- eclipse android 不会自动生成R.java文件和包的解决办法
eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法 我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动 ...
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...