c#高级编程笔记----委托

因为定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象。根据定义的可见性,和委托的作用域,可以在委托的定义上应用任意常见的访问修饰符:public、private、protected等:

实际上,“定义一个委托”是指“定义一个新类”。委托实现为派生自基类System.MulticastDelegate的类,System.MulticastDelegate又派生自基Syetem.Delegate。c#编译器能识别这个类,会使用其委托语法,因此我们不需要了解这个类的具休执行情况。这是c#与基类共同合作,使编程更易完成的一个范例。

构造函数:

在C#中,委托在语法上总是接受一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。给定委托的实例可以引用任何类型的任何对象的实例方法或静态方法---只要方法签名匹配于委托的签名即可。

private delegate string GetAString();

int x=40;

GetAstring firststringMethod = new GetAstring(x.Tostring);

GetAstring firststringMethod = x.Tostring;

注意:

  1.因为int.Tostring()是一个实例方法(不是静态方法),所以需要指定实例(x)和方法名来正确地初始化委托。(int x = 40;和声明对象差不多,只不过等号右边不是使用的new)

  2.调用上述方法名时输入形式不能为x.ToString()(不要输入圆括号),也不能把它传送给委托变量。输入圆括号代表调用一个方法。调用x.ToString()方法会返回一个不能赋予委托变量的字符串对象。只能把方法的地址赋予委托变量

通过委托调用方法:委托名字后面加圆括号的方式,圆括号中应包含调用该委托中的方法时使用的任何等效参数

firstStringMethod();

实际上,使用委托实例+圆括号的方式与调用委托类的Invoke()方法完全相同。因为firstStringMethod是委托类型的一个变量,所以C#编译器会用firstStringMethod.Invoke();代替firstStringMethod();

firstStringMethod.Invoke();

委托推断:

为了减少输入量,只要需要委托实例,就可以只传送地址的名称。这称为委托推断。

委托数组:

delegate double DoubleOp(double x);

Double0p[] operations =
{

//MultiplyByTwo为MathsOperations类中的一个静态方法(*2)
Math0perations.MultiplyByTwo,

//Square为MathsOperations类中的一个静态方法(平方)
Mathoperations.Square
};

该数组的每个元素都初始化为由MathsOperations类实现的不同操作。然后遍历这个数组,把每个操作应用到
\ 3个不同的值上。这说明了使用委托的一种方式——把方法组合到一个数组中来使用,这样就可以
在循环中调用不同的方法了。
这段代码的关键一行是把每个委托传递给PrOces跛mⅡsplayNmberO方法,例如

匿名方法:

到目前为止,要想使委托工作,方法必须己经存在(即委托是用它将调用的方法的相同签名定义的)。但还有另外一种使用委托的方式:即通过匿名方法。匿名方法是用作委托的参数的一段代码。用匿名方法定义委托的语法与前面的定义并没有区别。但在实例化委托时,就有区别了。下面是一个非常简单的控制台应用程序,它说明了如何使用匿名方法:
using system;
namespace Wrox.ProCSharp。Delegates
(
class Program
(
static void Main()

{string mid = ",  midd1e part,";
FunC(string、 string>anonDel = delegate(string param)
{
param += mid;
param += " and this Was added to the string.";
return param;
}
Conso1e。WriteLine(anonDel ("start of string"));

}}}

时间: 2024-08-15 00:26:54

c#高级编程笔记----委托的相关文章

4.28 UNIX环境高级编程 笔记

int dup(int filedes); int dup2(int filedes,int filedes2); 这两个函数都可以实现复制一个现存的文件描述符,但是dup一定返回当前可用最小文件描述符,dup2可以用filedes2参数指定新描述符数值.如果filedes2已经打开,则先将其关闭.如果filedes等于filedes2,则返回filedes2而不关闭. 这些函数返回的新文件描述符与参数参数filesdes共享同一个文件表项. 图3 执行dup之后的内核数据结构 dup2是原子操

《C#高级编程》委托、事件的示例代码

运行结果: Program.cs 1 using System; 2 3 namespace Wrox.ProCSharp.Delegates 4 { 5 class Program 6 { 7 static void Main() 8 { 9 var dealer = new CarDealer(); 10 11 var michael = new Consumer("Michael"); 12 dealer.NewCarInfo += michael.NewCarIsHere; 1

<unix高级编程>笔记 chapter1

os严格上是软件,为计算机提供资源和app运行环境. 特称为内核. 内核的接口被成为system call;然后库函数对system call进行了封装;shell是特殊app,为运行其他程序提供了一个接口. shell是个命令行解释器,读取输入,执行命令. unix文件系统是由directory和file组成.目录起点成为root,名字是/. 文件属性指类型\大小\所有者\权限以及修改时间.stat和fstat返回文件属性的结构. 比如下面操作: 2.文件名 只有/和null不能出现在文件名里

Android高级编程笔记(四)深入探讨Activity(转)

在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一般的Activity都占据了整个显示屏,但可以创建成半透明或二者浮动的Activity. 一.创建Activity 通过继承Activity类可以创建一个Activity窗口,基本框架如下: 1 public class MyActivity extends Activity { 2 @Overri

C#高级编程之委托

看C#高级编程第八版看到委托,有人说它和Java中的代理有些相似,但我认为这是一个C#与其他编程语言不同的地方,这也应该很重要,不然书上也不会大篇幅的讲委托的概念和应用.我在网上查阅了关于委托的资料,发现它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在. 那初次看见"委托"这个词,我脑海中出现的第一个疑问就是: 1.什么是委托? 我看完整这个章节,依然是一知半解的,功夫不负有心人,通过强大的网路,我寻找到了答案,那到底什

UNIX环境高级编程笔记之文件I/O

一.看图说话 一图胜过千言,看图! 二.唠一唠 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样.很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了.所以,对于那些致力于想在Linux下做开发的人来说,

C#高级编程笔记之第二章:核心C#

变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段,如果没有显式初始化,创建这些变量时,其默认值为0. 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用,如果在初始化之前使用了他的值,报错. 作用域 如果局部变量作用域冲突,报CS0136错. 字段与局部变量冲突,隐藏掉字段,访问被隐藏的实例字段用this关键字,静态字段使用object.f

ASP.NET高级编程笔记-简易版

##ASP.NET高级编程 #### 01 asp.net基本     - 1 配置web服务器 iis          - 1 默认文档 目录浏览等功能     - 2 基础控件         - TextBox Button CheckBox CheckBoxList DropDownList ListBox         - 文件上传             - 单文件小于4MB的上传                 - 路径使用Server.MapPath             

javascript高级编程笔记01(基本概念)

1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选,通过src属性指定代码的字符集,大多浏览器会忽略这个值,所以很少人使用 language:已放弃 src:可选,外部脚本的地址 type:可选,现在不推荐用“text/javascript”,考虑到约定俗成和最大限度的浏览器兼容,目前type属性的值还是text/javascript,不过,这个属性并不是必需