C#委托简介
C#中委托是一种引用类型,该引用类型与其他引用类型不同,在委托对象的引用中存放的不是对数据的引用而是存放对方法的引用,即委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。
声明格式如下:
【修饰符】delegate 【返回类型】 【委托名称】(【参数列表】)
与委托类型相匹配的方法必须满足以下两个条件:
1、 具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同
2、 具有相同的返回类型
委托是安全的,它与其他所有的C#成员一样是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。结构图如下:

如何使用委托?
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delegate; namespace Delegate
{ public delegate int Call(int num1, int num2);//第一步:定义委托类型
class SimpleMath
{
// 乘法方法
public int Multiply(int num1, int num2)
{
return num1 * num2;
} // 除法方法
public int Divide(int num1, int num2)
{
return num1 / num2;
}
}
}
class Test
{
static void Main(string[] args)
{
Call objCall;//第二步:声明委托对象
// Math 类的对象
SimpleMath objMath = new SimpleMath();
// 第三步:创建委托对象,将方法与委托关联起来
objCall = new Call(objMath.Multiply); Call objCall1 = new Call(objMath.Divide);
objCall += objCall1;//向委托增加一个方法
//objCall -= objCall1;//向委托减去一个方法
// 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide
int result = objCall(, );
System.Console.WriteLine("结果为 {0}", result);
Console.ReadKey();
}
}
写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);
2、委托 委托名 =会调用的方法名; 委托名(参数);
3、匿名方法
委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式
委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action<T>和Func<T>,第一个无返回值
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using @delegate; namespace @delegate
{
public delegate int Call(int num1, int num2);
class SimpleMath
{
// 乘法方法
public static int Multiply(int num1, int num2)
{
return num1 * num2;
} // 除法方法
public int Divide(int num1, int num2)
{
return num1 / num2;
}
}
class Test
{
static void Main(string[] args)
{
//--------------------第一种写法------------------------//
//Call objCall = new Call(SimpleMath.Multiply);
//Call objCall1 = new Call(new SimpleMath().Divide);
//--------------------第二种写法------------------------//
//Call objCall = SimpleMath.Multiply;
//Call objCall1 = new SimpleMath().Divide;
//--------------------第三种写法------------------------//
//Call objCall = delegate(int a, int b)
//{
// return a * b;
//};
//Call objCall1 = delegate(int a, int b)
//{
// return a / b;
//};
//--------------------第四种写法------------------------//
//Call objCall =((int a,int b)=> { return a*b;});
//Call objCall1 = ((int a, int b) => { return a / b; });
//--------------------第五种写法------------------------//
Func<int, int, int> objCall = ((a, b) => { return a * b; });
Func<int, int, int> objCall1 = ((a, b) => { return a / b; });
Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });
ob(, );
//----------------------------------------------------//
int result = objCall(, );
int result1 = objCall1(, );
System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);
Console.ReadKey();
}
}
}
注:部分内容转自http://www.cnblogs.com/Blackieboy/articles/2203346.html
C#委托简介的更多相关文章
- lambda和委托
Lambda 简介 Lambda 表达式是一种可用于创建委托或表达式目录树类型的一种匿名函数(匿名方法+Lambda).通过使用 lambda 表达式,可以写入可作为参数传递或作为函数 调用值返回的本 ...
- C#基础加强(8)之委托和事件
委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
- lambda和委托那点事
Lambda 简介 Lambda 表达式是一种可用于创建委托或表达式目录树类型的一种匿名函数(匿名方法+Lambda).通过使用 lambda 表达式,可以写入可作为参数传递或作为函数 调用值返回的本 ...
- (.NET高级课程笔记)Lambd、Linq总结
知识总结 1.委托简介:委托是一种类型,可以写在类里,也可以写在类外面,级别和类一样高. 2.匿名方法.匿名类 3.Lambda表达式:goes to 4.系统自带委托:Func/Action 5.扩 ...
- C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介
委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...
- c#中的数据类型简介(委托)
c#中的数据类型简介(委托) 什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature).定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名, ...
- C# 委托、匿名方法、lambda简介
在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...
- 委托(Delegate)简介
1.什么是委托?是用来干什么的? 委托是一个类,它定义了方法的类型,使得可以将定义的方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Swit ...
随机推荐
- UISegmentedControl——分段控件
分段控件,提供了一组按钮,但是只能激活一个.通过UIControlEventValueChanged事件实现与用户的交互,并通过selectedSegmentIndex判断当前选定的控件,通过titl ...
- linux平台很nice的工具
htop工具 这个是top的升级版,查看进程.内存.CPU等性能的工具,主要是界面很人性化.
- STM32F412应用开发笔记之八:迪文串口屏显示驱动
迪文的显示屏使用起来比较方便,其使用串口通讯,即可支持RS232,又可以支持TTL电平.在NUCLEO-F412ZG实验板上,USART2已经引到了CN9上,我们就利用USART2来实现与迪文串口屏的 ...
- IOS开发中使用AFNetworking请求网络数据
1.把AFNetworking的文件拖放到项目中(注意不同的版本方法不一样,本历程基于版本2013): 2.使用#import "AFNetworking.h"命令把AFNetwo ...
- Zookeeper的基本概念
Reference: http://mp.weixin.qq.com/s?src=3×tamp=1477979201&ver=1&signature=bBZqNrN ...
- asp.net实现断点续传
C# 断点续传原理与实现 在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是 一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB ...
- UVa 10132 - File Fragmentation
题目大意:有n个相同的文件,每个文件从中间分为两半,现在给你这2n个文件碎片,求原来完整的文件. 找出文件碎片长度的最大值和最小值,二者相加可得到原来文件的长度len.然后逐个进行拼接,将拼接后长度等 ...
- AutoLayout没有相对比例布局
怎么实现相对比例布局 比如我一个控件相对上边距的位置在整个屏幕的比例 可以用stack view来管理相对布局
- 笔记整理——C语言-http-1
http 传输原理及格式 - friping - ITeye技术网站 - Google Chrome (2013/4/1 14:02:36) http 传输原理及格式 博客分类: 其他 应用服务器浏览 ...
- java_web学习(3)XML基础
XML 技术概述 XML是一种通用的数据交换格式.为实现计算机之间的文档交换而设计的文档内容编写规范,语法与HTML相似;XML的作用:统一信息的结构,实现不同系统之间的相互通信;目前许多系统的配置文 ...