总结:C# 委托的全面理解
在说事件之前得先了解委托。
委托,外表看来和C/C++中函数指针没什么区别,但是本质上你才发现他其实就是个类!也就是说理解委托得从
这个两个方面去理解(单从一个方面去理解感觉就怪怪的呵呵!)
理解委托:
什么是委托?委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。
声明一个委托,相当于声明了一个是函数指针类型,委托是一种类型,进一步说,他就是一个类!
他的目的就是,将方法可以作为其他方法的参数传递!进一步说,就是一个方法内部需要调用另一种方法
(及方法内部还有一个方法),且这个内部调用的方法存在多样性。那么最好的方法就是将内部的方法作为外
部的方法的参数数进行传参~~
委托的形式:
声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如delegate void deleProcess(string s);
注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是deleProcess不是函数名,而是委托类型名!
委托的使用:
委托是c#中,可以订阅一个或多个具有相同签名方法的函数指针。所以说委托的使用和函数指针的使用是差不多的。
把它想象成一个指针就知道怎么用了~~但是委托又不能完全的看成一个函数指针(本质上是个类),这是因为委托考虑到更多的安全性,
它需要存储特定方法的细节。所以,定义好委托后,还需要创建一个委托实例,才可以使用(以存储特定方法的细节)!
假设有一个函数是:void SayHi(String s); 这个正好和delegate void deleProcess(string s);这个委托的签名一致。
那么我们开始使用委托:
deleProcess pro = new deleProcess(SayHi);//实例化一个委托,并且用SayHi方法初始化它。
deleProcess pro = SayHi; //这是上面的简写形式,编译器帮我们进行了new!看上去是直接与方法关联(看起来有指针的感觉呵呵),其实还是通过委托!
注意SayHi以及pro都没有带“括号”的这是应为如果带上括号就是方法的调用了。好了当委托指向方法成功之后。
pro(s)就和SayHi(s),达到同一个目的了。
最终的目的委托是为了方法作为方法的参数:
viod GreetPeople(string name, deleProcess pro)//这个GreetPeople方法,就利用了委托将方法作为参数了!
{
pro(name);//pro用起来就和方法是一样的~~
}
如此就可以把SayHi方法作为参数传递了:
GreetPeople(song,SayHi);
//摘抄自《C#高级编程》
委托的一个特征是它们的类型是安全的,可以确保被调用的方法签名是正确的。
但有趣的是,它们不关心调用该方法的是什么类型的对象,甚至不考虑该方法
是静态方法,还是实例方法。
提示:
给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法——只要方法
的签名匹配于委托的签名即可。
//-------------------------------------------------------------------------------------------------------------
//委托使用的例子~~
delegate string ProcessDelegate(string s);
static void ProcessIntArray(ProcessDelegate p)
{
string[] values = new string[] { "aB","Cd"};
for (int i = 0; i < values.Length; i++)
{
values[i] = p(values[i]);
}
Console.WriteLine("处理后");
foreach (string s in values)
{
Console.WriteLine(s);
}
}
编写函数,大写、小写、加引号
进一步体会:和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
总结:C# 委托的全面理解的更多相关文章
- C#委托零基础理解
C#委托零基础理解(转) 1, 为什么使用委托 2.什么是委托 3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委 ...
- C#委托之个人理解
C#委托之个人理解 什么是委托 首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西. 如何使用委托 在使用委托的时候,你可以像对待一个类一样对待它.即先 ...
- winform总结2> Action<> ,Action,func<>,委托相关的理解
1,他们是什么: Action 封装一个方法,该方法不具有参数并且不返回值. Action<> 封装一个方法,该方法具有最多16个参数并且不返回值. func<> 封装一个具有 ...
- C#对委托的初步理解理解
作为新手对委托的学习: 1.定义委托:委托实际上是一个类,在定义委托前就知道了方法的返回类型和方法的参数类型(可以把委托理解为只知道方法的返回类型和方法的参数类型,不知道方法体) public de ...
- C#基础:对委托的简单理解
在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);).是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!! 线程大家应该熟悉吧,在计算机中并行运 ...
- C#委托,事件理解入门 (译稿)
原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...
- 深入理解C# 委托(delegate)-戈多编程
今天来谈谈委托,深入理解委托,本文来自各大神经验总结. 1.委托是什么? 委托类型的声明与方法签名相似. 它有一个返回值和任意数目任意类型的参数,是一种可用于封装命名方法或匿名方法的引用类型. 委托类 ...
- C#委托的最简单入门和理解
委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- java工程打jar包
下面记录一下打jar包的方法 对于含有第三方jar的工程需要写MANIFEST.MF文件,文件结构如下: Manifest-Version: 1.0 .jar .jar Main-Class: Sel ...
- Git 命令快速浏览
Git 命令快速浏览 创建 Git 可管理的仓库 git init 查看当前仓库的状态 git status 添加到仓库,实际上是添加到暂存区 git add [-A | --all] git add ...
- JAVAEE——SSH项目实战01:SVN介绍、eclipse插件安装和使用方法
1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...
- Oracle EBS OPM reshedule batch
--reschedule_batch --created by jenrry DECLARE x_message_count NUMBER; x_message_list VARCHAR2 (2000 ...
- Oracle EBS INV创建保留
CREATE or REPPLACE PROCEDURE CreateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...
- Error Fix – Replication subscriber does not exist on the server anymore(删除Replication时报错的解决办法)
Recently one of my client has faced weird situation related to SQL Server Replication. Their main da ...
- systemd-analyze – 在Linux中查找系统启动性能统计信息
您是否在使用 systemd 系统和服务管理器,并且您的 Linux 系统需要较长时间才能启动,或者您希望查看系统启动性能的报告? 如果是的话,你已经登陆了正确的地方. 在本文中,我们将向您展示如何使 ...
- InfoPath读取数据库
public void LoadBtn_Clicked(object sender, ClickedEventArgs e) { // 配置连接字符串 using (SqlConnection con ...
- Android高级_第三方下载工具Volley
Volley下载主要应用于下载文本数据和图片数据两个方向,下面分别介绍: 一.使用Volley开启下载,首先要做的是导包和添加权限: (1)在build.gradle文件中导入依赖包:compile ...
- Java MySQL数据类型对照
Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 varchar L+N VARCHAR java.lang.S ...