EventHandler 与常见的.Net预定义委托

看着下面这两句事件定义及激发忽然有点不明白了,

public event EventHandler<ExternalDataEventArgs> Submit;

Submit(null, args);

貌似该事件定义时只传一个参数args, 但实际激发时要传两个参数, 咋回事捏!

其实, 这是误解,  这个EventHandler<ExternalDataEventArgs>是个泛型版的预定义委托, 该委托实际的定义如下:

public delegate void EventHandler<TEventArgs> (
Object sender,
TEventArgs e
) where TEventArgs : EventArgs

而非泛型版的定义如下:

public delegate void EventHandler (

  Object sender,

  EventArgs e

)

这样就明白了, 事件确实是需要两个参数.

推荐资料: .NET Framework委托的预定义方法介绍

http://webservices.ctocio.com.cn/net/430/9352430.shtml

此文中这段甚对, "从.NET Framework2.0开始以来,系统预定义的委托使使代码看起来有点像“天书”,再加上匿名表达式,以及后面Lambda表达式的“掺和”,代码就更加难懂了."

因此,多梳理,多熟悉一下才行。

类似的预定义委托还有:

1.Action 封装1-16个参数, 无返回值.

public delegate void Action<in T>(
 T obj
)

public delegate void Action<in T1, in T2>(
 T1 arg1,
 T2 arg2
)

2.Func 封装1-16个参数, 返回值TResult.

public delegate TResult Func<out TResult>(

)

public delegate TResult Func<in T, out TResult>(
 T arg
)

3.Predicate 表示定义一组条件并确定指定对象是否符合这些条件的方法。

public delegate bool Predicate<in T>(
 T obj
)

推荐资料:

EventHandler 泛型委托
http://msdn.microsoft.com/zh-cn/library/db0etb8x(v=VS.80).aspx

Action<T> 委托
http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx

Func<TResult> 委托
http://msdn.microsoft.com/zh-cn/library/bb534960.aspx

Predicate<T> 委托
http://msdn.microsoft.com/zh-cn/library/bfcke1bz(v=VS.100).aspx

作者:BobLiu
邮箱:[email protected]
出处:http://www.cnblogs.com/liuzhendong
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
时间: 2024-08-03 21:25:07

EventHandler 与常见的.Net预定义委托的相关文章

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

C# 系统预定义的委托EventHandler

.net 预定义了两个委托EventHandler如下. // 表示将用于处理不具有事件数据的事件的方法. // // 参数: // sender: // 事件源. // // e: // 不包含事件数据的对象. [ComVisible(true)] public delegate void EventHandler(object sender, EventArgs e); // // e: // 包含事件数据的对象. // // 类型参数: // TEventArgs: // 事件生成的事件数

PHP预定义变量$_SERVER

PHP预定义变量$_SERVER $_SERVER 是一个包含诸如头部(headers).路径(paths)和脚本位置(script locations)的数组.数组的实体由 web 服务器创建,不能保证所有的服务器都能产生所有的信息.下面是一些常见的操作: 当前脚本的绝对路径,我本地的index.php脚本的绝对路径为:F:/phpStudy/WWW/test/index.php. $_SERVER['SCRIPT_FILENAME'] => F:/phpStudy/WWW/test/inde

(二)预定义数据类型

一.值类型和引用类型 1.值类型和引用类型的区别 (1)值类型直接存储值,引用类型存储对值得引用 (2)值类型存储在堆栈中,引用类型存储在托管堆上 2.如果变量是一个引用,则可以把其值设置为null,表示它不引用任何对象 3.在C#中,基本类型如bool和long都是值类型.相反,大多数更复杂的C#数据类型,包括我们自己声明的类都是引用类型. 4.如果需要把自己的类型定义为值类型,就应该把它声明为一个结构. 二.CTS类型 C#认可的基本预定义类型并不是内置在C#语言中的,而是内置于.NET F

Attribute(一)——预定义特性

在项目中接触到了Attribute,那么什么是Attribute,有些什么作用呢?这里来了解一下. 一.什么是Attribute Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联.目标元素可以是程序集.类.构造函数.委托.枚举.事件.字段.接口.方法.可移植可执行文件模块.参数.属性 (Property).返回值.结构或其他属性 (Attribute) 在这里,我们需要将Attribute和property分开 property是指类想外提供的字段,它属于面向对象层

php预定义变量,超全局变量,魔术方法,特殊函数变量使用

<?php /* * 本代码全部为测试函数代码,部分注释和写实例 * * 修改php.ini variables_order=”EGPCS” * 请注意$_REQUEST在优先级传参的时候会造成数据被覆盖,出现重大bug,建议不要使用 * * 请注意一下是重要的一些超全局参数并不是全部的 * * 软件全部都是编译安装,/usr/local/php * * * */ header("Content-type:text/html;charset=utf-8"); echo $_SER

预定义变量的使用(五)

在 makefile 中存在一些预定义的变量,如自动变量:[email protected],$^,$< 等:还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等.下来我们先来解释下自动变量的意义:a> [email protected] 是指当前规则中触发命令被执行的目标:b> $^ 是指当前规则中的所有依赖:c> $< 是指当前规则中的第一个

JS正则表达式从入门到入土(4)—— 预定义类与边界

预定义类 正则表达式提供预定义类来匹配常见的字符类 字符 等价类 含义 . [^\r\n] 除了回车符和换行符以外的所有字符 \d [0-9] 数字字符 \D [^0-9] 非数字字符 \s [\t\n\x0B\f\r] 空白符 \S [^\t\n\x0B\f\r] 非空白符 \w [a-zA-Z_0-9] 单词字符(字母.数字.下划线) \W [^a-zA-Z_0-9] 非单词字符 使用预定义类可以快速匹配目标,如:匹配一个ab+数字+任意字符,使用字符类.范围类需要书写大量的代码,而使用预定

C#变量,常量,预定义数据类型、名称控空间之基础点

1.变量的初始化:在使用变量之前需要对变量进行初始化 1>类中或者结构中的字段,在未进行显示初始化时,变量的默认值是0; 2>方法中的变量必须显示初始化才能正确的调用,举例说明引用类型的初始化:Something objSomething;此时变量仅仅创建了引用,这个引用未指向任何对象,无法调用该变量:     objSomething=new Something();使用new 关键字将该引用指向存储在堆上的一个对象 2.var关键字的类型推断 1>变量必须初始化,2>初始化器不