• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#委托详解和和示例分享

c#委托详解和和示例分享

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#委托,c#委托和事件,c#委托的用法,c#委托的作用,c#中的委托等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
什么是委托?

委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活多个方法的地址,而不是数据。

委托虽然看起来像是一种类型,但其实定义一个委托,是定义了一个新的类。下面这行代码,定义了一个委托,使用ILDasm.exe查看其生成的IL代码如图所示:

由图中红色框线中可以看出,.NET将委托定义为一个密封类,派生自基类System.MulticastDelegate,并继承了基类的三个方法(稍后讨论这三个)。

委托与函数指针的区别

1、安全性:C/C++的函数指针只是提取了函数的地址,并作为一个参数传递它,没有类型安全性,可以把任何函数传递给需要函数指针的地方;而.NET中的委托是类型安全的。

2、与实例的关联性:在面向对象编程中,几乎没有方法是孤立存在的,而是在调用方法前通常需要与类实例相关联。委托可以获取到类实例中的信息,从而实现与实例的关联。

3、本质上函数指针是一个指针变量,分配在栈中;委托类型声明的是一个类,实例化为一个对象,分配在堆中。

4、委托可以指向不同类中具有相同参数和签名的函数,函数指针则不可以。

    class Student
    {
        private String name = "";
        public Student (String _name)
        {
            this.name = _name ;
        }
        public Student() {}
        public void getStudentName(String _name)
        {
            if (this.name != "" )
                Console.WriteLine("Student's name is {0}", this.name);
            else
                Console.WriteLine("Student's name is {0}", _name);
        }
    }

    class Teacher
    {
        private String name;
        public Teacher(String _name)
        {
            this.name = _name;
        }
        public void getTeacherName(String _name)
        {
            if (this.name != "")
                Console.WriteLine("Teacher's name is {0}", this.name);
            else
                Console.WriteLine("Teacher's name is {0}", _name);
        }
        public string getClassName()
        {
            return "Eanlish";
        }
    }
}
</div>

上述测试代码运行结果如下:

当指向签名不符的方法时会提示如下错误,证实了委托的安全性。

下面来看看C#中实现委托有哪些方式及各自主要适用范围。

1、常规实现

为了简便输入,C#支持只传送地址的名称给委托的实例(委托推断),如下两行代码在编译器看来是一样的。

实际上委托的实例可以引用任何类型的任何对象上的实例方法或静态方法,只要方法的签名匹配于委托的签名即可。所以结构体的方法一样可以传递给委托。

2、多播委托
多播委托具有一个带有链接的委托列表,称为调用列表,在对委托实例进行调用的时候,将按列表中的委托顺序进行同步调用。如果委托有返回值,则将列表中最后一个方法的返回值用作整个委托调用的返回值。因此,使用多播委托通常具有void返回类型。

可以使用+=来使委托指向多个方法的地址,但必须是在委托实例化之后才可以使用+=来添加新的方法地址(添加重复的方法地址编译器不会报错,但是也不会重复执行),若想移除其中的方法地址可以使用-=来实现(需要至少保留一个,即

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#中的委托使用
  • C#事件用法实例浅析
  • C#可空类型用法分析
  • C#中委托用法实例分析
  • C#委托现实示例分析
  • C#中委托的进一步理解
  • C#中委托的+=和-=深入研究
  • C#中的集合用法分析
  • C#中委托和事件的区别实例解析
  • C#中事件的继承实例分析

相关文章

  • 2017-05-28C#递归读取XML菜单数据的方法
  • 2017-05-28C#对称加密与非对称加密实例
  • 2017-05-28C#实现图片放大功能的按照像素放大图像方法
  • 2017-05-28C#软件注册码的实现代码
  • 2017-05-28C#文件流进行压缩和解压缩的方法
  • 2017-05-28实现ASP.NET无刷新下载并提示下载完成的开发思路
  • 2017-05-28C#中datatable序列化与反序列化实例分析
  • 2017-05-28C#如何将DataTable导出到Excel解决方案
  • 2017-05-28详谈.net中的垃圾回收机制
  • 2017-05-28C#影院售票系统毕业设计(2)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#计算代码执行时间的方法
    • c++函数转c#函数示例程序分享
    • C#组件系列 你值得拥有的一款Excel处理神器Spire.XLS
    • C#读写文件的方法汇总
    • 深入探讨C#中的const、readonly关键字
    • C#实现读取被进程占用的文件实现方法
    • Microsoft Expression Web 简体中文正式版 官方下载地址
    • C#中委托用法
    • 深入线程安全容器的实现方法
    • c#中Linq to Sql 增删除的实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有