.net委托(转载)
一、什么是委托?
委托就是定义一个 对于方法的引用,类似于c++中的函数指针。委托是用来将方法作为参数 传递进入其它方法的,
委托的格式?
修饰符1 delegate 修饰符2 委托类型名(变量n);
修饰符1 为定义的委托的范围修饰符,常用public;
修饰符2为 返回值类型修饰符,如 : void ,string ,char等;
名字 为我们定义一个委托类型时所为它取得名字;
对于 变量n 我们常常会有疑惑,委托是一个 方法吗? 为什么会有返回值 以及变量呢 ?
其实,委托并不是一个方法 ,而是一个 类型,它之所以有返回值以及变量是为了 保持 与其委托的方法 保持一致;
注意 : 委托是一个 类型 所以我们常常把它定义在一个 类的外面;
还有 ,委托类型定义之后,我们还不能直接拿过来使用,还需要对它定义该类型的 委托变量;
格式 :
修饰符1 delegate 修饰符2 委托类型名(变量n);
委托类型名 委托变量;
使用时,还需要注意,我们在使用时要使用定义的委托变量,而不是定义的委托类型名,这类似于我们定义枚举型一样; 因为定义的委托变量是一个变量,所以 在使用之前我们还要对其进行赋值。
格式: 修饰符1 delegate 修饰符2 委托类型名(变量n);
委托类型名 委托变量;
委托变量=委托方法名;
注意: 这里的委托方法名就是你要委托的方法的名字,而且注意,不要加上了方法的参数以及括号,同时 ,这里委托的方法 还要与 该委托类型定义时所 定义的 返回值类型、参数列表类型以及参数个数 保持一致;
我们要先定义一个 方法;
范围修饰符 【static】 返回值类型修饰符 调用方法名( 变量n, 委托类型 委托变量)
{
委托变量(变量n);
.
.
.
委托变量(变量 n);
}
上边的变量n就是你所委托的方法的参数;
开始使用了 :
1) 委托类型 委托变量;
2) 委托变量=委托方法名;
3) 调用方法名(变量n,委托变量);
完整示例如下:
using System; using System.Collections.Generic;
using System.Text; namespace 委托示例
{
public delegate void del(string str); //定义的委托类型
calss 示例
{
static void send(string i) //要委托的方法
{
console.WriteLine(i);
} static void sendup(string list,del handler) //调用方法
{
handler(list);
} public static void mian(string [] args) //主方法
{
del 委托变量=send; // 该句相当于: del 委托变量; 委托变量=send;
sendup("这是一个 委托的示例!!!",委托变量);
console.ReadKey();
} }
}
二、Action与Func
Action委托:封装一个方法,该方法具有参数(0到16个参数)并且不返回值
Func<T,TResult>委托:封装一个方法,该方法具有参数(0到16个)和一个返回值
实例:
public class DeleDemo
{
/// <summary>
/// 有一个参数但没有返回值
/// </summary>
/// <param name="str"></param>
public static void Say(string str)
{
Console.WriteLine(str);
}
/// <summary>
/// 有两个参数,有一个返回值
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static int Add(int a, int b)
{
return a + b;
}
Action<string> action = new Action<string>(Say);
Func<int, int, int> func = new Func<int, int, int>(Add); /// <summary>
/// 将委托作为参数传给方法
/// </summary>
/// <param name="action"></param>
/// <param name="func"></param>
public void Test(Action<string> action,Func<int,int,int> func)
{
action("Hello");
Console.WriteLine(func(, ));
} /// <summary>
/// 主函数
/// </summary>
public void Main()
{
Test(action, func); //调用Test方法
}
}
三、Predicate
是返回bool型的泛型委托,Predicate有且只有一个参数,返回值固定为bool。表示定义一组条件并确定指定对象是否符合这些条件的方法。此方法常在集合(Array 和 List<T>)的查找中被用到,如:数组,正则拼配的结果集中被用到。
public class PredicateDemo
{
public int[] myNum = new int[] { , , , , , , , }; //定义一个数据
public int[] myResult; //返回结果 //定义一个方法,只有一个参数且返回bool类型,判断是否是偶数
public static bool IsEven(int num)
{
if (num % == )
{
return true;
}
else
{
return false;
}
}
Predicate<int> predicate = new Predicate<int>(IsEven); /// <summary>
/// 主程序
/// </summary>
private void Main()
{
//bool res = predicate(23);
myResult = Array.FindAll<int>(myNum, predicate); //调用
}
}
总结:
.net委托(转载)的更多相关文章
- C#委托(转载)
C#委托的介绍(delegate.Action.Func.predicate) from:http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了 ...
- C#动态对象(dynamic)示例(实现方法和属性的动态)
C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点J ...
- 转载 C#匿名函数 委托和Lambda表达式
转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...
- 转载:C#中事件和委托的编译代码
接上文转载:C#中事件的由来,这时候,我们注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误: public event Gr ...
- 转载: jQuery事件委托( bind() \ live() \ delegate()) [委托 和 绑定的故事]
转载:http://blog.csdn.net/zc2087/article/details/7287429 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- [转载]C#深入分析委托与事件
原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...
- [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)
原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...
- C#委托的介绍(delegate、Action、Func、predicate) --转载
来源:http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1 ...
- 《C#高级编程》之委托学习笔记 (转载)
全文摘自 http://www.cnblogs.com/xun126/archive/2010/12/30/1921551.html 写得不错,特意备份!并改正其中的错误代码.. 正文: 最近 ...
随机推荐
- Yii里表单的操作方法(展示渲染待续......)
<?php$form=\yii\widgets\ActiveForm::begin(['action'=>\yii\helpers\Url::to('name/create')]);ech ...
- 【练习】flashback基于scn的闪回查询
1.创建表dept1: :: SCOTT@ORA11GR2>create table dept1 as select * from dept; Table created. :: SCOTT@O ...
- 移动端UC浏览器和QQ浏览器的部分私有meta属性
UC浏览器 1.设置屏幕横屏还是竖屏 <meta name="screen-orientation" content="portrait | landscape&q ...
- 使用PHP导入和导出CSV文件
我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE `student` ( ...
- php中好用的时间函数
//查询数据30天的数据$y=date("Y",time());$m=date("m",time());$d=date("d",time() ...
- QuerySet创建新对象的方法和获取对象的方法
新建一个对象的方法有以下几种: Person.objects.create(name=name,age=age) p = Person(name="WZ", age=23) p.s ...
- Java系列笔记(1) - Java 类加载与初始化
目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个 ...
- C# WinForm 单例模式(例:同一个窗体只创建一次实例)
//C# WinForm 单例模式(例:同一个窗体只创建一次实例) //打开窗体的事件: Form3 f = Form3.InstanceObject() ; //实例化窗体 f.Focus(); / ...
- Maven3路程(三)用Maven创建第一个web项目(1)
一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...
- Linux内核分析第六周学习总结:进程的描述和进程的创建
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...