初学笔记(C#委托)

1.委托的概述

简单说,委托就是把方法当作参数传递。

委托(delegate)是一种动态调用方法的类型,它与类、接口和数组一样,都属于引用型。在C#中,可以申声明委托类型、创建委托实例、把方法封装在委托对象中。一个完整的饭否发具有方法名、返回值和参数列表,用来引用方法的委托也要求必须具有相同的返回值和参数列表。

委托对象的本质代表了方法的引用(即内存地址),具有以下特点:

  • 与C++中的指针相似,但不同的是委托是完全面向对象的,是安全的数据类型。
  • 委托允许将方法作为参数传递。
  • 委托可用回调函数。
  • 委托可以把多个方法连在一起。可在触发事件时,启动多个事件处理程序。

2.委托的声明、实例化与使用

  2.1委托的声明

委托是一种引用型的数据类型,在C#中使用关键字delegate声明,一般形式如下:

[访问修饰符] delegate 返回值类型 委托名([参数列表])

  2.2 委托的实例化

委托是一种特殊的数据类型,因此必须实例化之后才能用来调用方法。一般形式如下:

委托类型   委托变量名=new 委托型构造函数(委托要引用的方法)

  2.3 使用委托

    实例化之后,就可以通过委托对象调用它所引用的方法。使用委托对象调用所有所有的方法时,必须保证参数的类型、个数、顺序和方法声明匹配。

2.4使用匿名方法

允许将代码块作为参数传递,以避免单独定义方法,使用匿名方法创建委托对象的一般形式如下:

委托类型 委托变量名=delegate([参数列表]){//代码块}

3.多路广播与委托组合

        实际上,C#允许使用一个委托对象调用多个方法,当向委托添加更多的指向其他方法的引用时,这些引用将被存储在委托的调用列表里,这种委托叫多路广播委托。C#的所有委托都是隐式的多路广播委托。向一个委托的调用列表添加多个方法引用,可以通过该委托一次性调用所有的方法,这个过程称为多路广播。

实现多路广播的方法有两种:

  • 通过“+”运算符直接将两个同类型的委托对象组合起来。

例如:

假设有一委托Calculate

Calculate  a=new Calculate(Add);

Calculate b= new Calculate(Mulipty);

a=a+b;

由于一个委托对象只能返回一个值,且只返回调用列表中最后一个方法的返回值,因此为了避免混淆,建议在使用多路广播时,每个方法均用void定义。

  • 通过“+=”运算符将新创建的委托对象添加到委托调用列表zhong。还可以使用“-=”运算符来移除调用列表中的委托对象。
时间: 2024-08-06 14:59:40

初学笔记(C#委托)的相关文章

初学笔记(C#事件)

1.声明事件      EventHandler是一个预定义的委托,它定义了一个无返回值的方法.在 .Net Fromwork中,他的格式: public  delegate  void EventHandler (Object  sender, EvenArgs  e) 其中sender的类型为Object,表示时间发布者本身,e用来传递事件的相关信息,数据类型为EvenArgs及其派生类. 标准的EvenArgs并不包含任何事件数据, 因此EventHandler专用于表示不生成数据的事件的

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

lisp初学笔记

学习任何知识,都不能仅仅把它们当做知识,更重要的是要把它们在实际编程实践中应用起来,持有这样的学习观念才不至于让你变成学究式的活字典,对于程序员来说这一点尤其重要,你学习的任何语言知识,一定要在实际的程序编写过程中不断练习.不停实践,纸上得来终觉浅,绝知此事须躬行. LispBox 实际上是把 Emacs.Slime.Clozure CL 以及 QuickLisp 集成到一起,使用 LispBox 做开发环境就相当于选择了 Emacs 作为编辑器.选择 Slime 作为交互界面,那么一定要熟悉

flex入门--初学笔记1

环境:flashBuilder + eclipse 4.2 基本控件: 1 <mx:Script> 2 <![CDATA[ 3 import mx.controls.Alert; 4 public function showMsg(msg:String):void{ 5 mx.controls.Alert.show(msg); 6 } 7 ]]> 8 </mx:Script> 9 <mx:Panel title="常用控件" width=&qu

AS3 初学笔记 actionscript-之变量

变量 变量可用来存储程序中使用的值.要声明变量,必须将 var 语句和变量名结合使用.在 ActionScript 2.0 中,只有当您使用类 型注释时,才需要使用 var 语句.在 ActionScript 3.0 中,总是需要使用 var 语句.例如,下面的 ActionScript 行声明一个名 为 i 的变量: var i; 如果在声明变量时省略了 var 语句,则在严格模式下会出现编译器错误,在标准模式下会出现运行时错误.例如,如果以前未 定义变量 i,则下面的代码行将产生错误: i;

js&#39;初学笔记

之前看过一个博主说的学习前端养成写博客的习惯,我慢慢学着在上面写点东西,记录我的学习. 这段时间把之前学的js基础补上一点,学了一些对数组和字符的操作,split(),将字符串变成数组.join(),数组变为字符串.conca()连接数组. charAt(),charCodeAt(),formCharCode(),slice(start,end),substring(),substr(start,length);indexOf(); 有一些我就不多说了,在这里记下来,以后看看,有兴趣可以看看山冈

网站初学笔记3-HTML实用元素

HTML中链接邮件地址: <!DOCTYPE html><html><body> <address>Written by <a href="mailto:[email protected]">Donald Duck</a>.<br> Visit us at:<br>Example.com<br>Box 564, Disneyland<br>USA</addres

TensorFlow官方文档MNIST初学笔记[二]

TensorFlow官方文档MNIST初学笔记[二] MNIST是一个简单的计算机视觉数据集, 它还包括每个图像的标签, 每个图像是28像素乘以28像素, 我们可以把这个数组变成一个28×28 = 784个数字的向量.MNIST只是一个784维向量空间中的一个点.mnist.train.images具有形状的张量(n维阵列)[55000, 784] 第一维度是图像列表中的索引,第二维度是每个图像中每个像素的索引.对于特定图像中的特定像素,张量中的每个条目是0和1之间的像素强度. MNIST中的每

网站初学笔记3-HTML实用元素2

HTML 链接 - name 属性 name 属性规定锚(anchor)的名称.您可以使用 name 属性创建 HTML 页面中的书签.书签不会以任何特殊方式显示,它对读者是不可见的.当使用命名锚(named anchors)时,我们可以创建直接跳至该命名锚(比如页面中某个小节)的链接,这样使用者就无需不停地滚动页面来寻找他们需要的信息了. 首先,我们在 HTML 文档中对锚进行命名(创建一个书签):<a name="tips">基本的注意事项 - 有用的提示</a&

网站初学笔记1

什么是 WWW?WWW 指万维网(World Wide Web)万维网常被称为WebWeb 是由遍布全球的计算机所组成的网络所有 Web 中的计算机都可以彼此通信所有这些计算机都使用名为 HTTP 的通信标准 WWW 如何工作?Web 信息存储于被称为网页的文档中网页是存储于被称为 Web 服务器的计算机上读取网页的计算机称为 Web 客户端Web 客户端通过称为浏览器的程序来查看网页主要的浏览器有 Internet Explorer 和 Mozilla Firefox 浏览器如何读取页面?浏览