快捷搜索:

对C# 2.0中匿名方法的怀疑分析

所有的方法都使用一个来自于相同集合的元素的子集。在C# 2.0中,可选元素集将会继续增加 。从前史 上看-除了C++内联方法之外-方法都要求有一个名字、一个返回类型和一个方法体。并且 可选择地,方法能够使 用存取修饰符和一个参数列表。在C# 2.0中,方法名现已 从必需的变成了可选的。

C# 2.0(一般就代表.NET)引入了匿名方法。一个匿名方法可以被用在任何使用代理且该代理被定义 为内联的状况 下,它不需要方法名,而具有可选的参数和一个方法体。

为了使用匿名方法,你需要了解什么是代理。因此,在我们详细评论 何时使用匿名方法以及匿名方法的局限性之前,先让我们简要地回忆 一下代理。

二、 代理回忆

匿名方法关于 声明和使用代理来说是一种紧缩 方式(假如 你对什么是代理还有疑问,请继续阅读;不然 ,可以跳过下面的这一部分)。代理,作为一种指向函数签名的指针,在.NET言语 之前的言语 中就已存在。切记,在核算 机中一切其实都是位和字节。通过引入函数指针技能 ,有可能动态地把一些未来的现在 还没有 知的函数赋给指针,并由此诞生了工作 。

函数指针的底子 使用方法是,可以把一个函数的地 址赋给一个单一的指针。为了通过一个指针来调用该函数,程序员要对之进行查看 以抉择 是否这个指针为null,然后直接 地通过这个指针调用这个函数。总之,要使用指针,有必要 进行null查看 ,而现在"一个指针对应一个函数"作为一种限制也该到完毕 的时分 了。

回忆 一下来分析,代理睬 成为原始函数指针的下一个进化代替 者。一个代理便是 一个类,它对该指针进行了封装;隐含地,.NET中的代理是multicast代理。作为一个multicast代理仅仅意味着不再存在"一个函数对应一个指针"的限制,因为multicast代理类包括 一个指针列表。包括 一个内部列表意味着多于一个函数的地 址可以被赋值给一个单一的代理。当该代理-你可以认为是"工作 "-被激发或调用时,所有的内部列表函数被调用。

留意 在C#中,我们调用代理的方式就象从前我们调用方法以及调用所有的赋值函数一样;但是 我们仍然可以 进行null查看 。在Visual Basic.NET中,null查看 隐含在激活工作 行为中。

在C#中,函数地 址通过使用一个重载的+=操作符刺进 到一个列表中并且经由一个重载的-=操作符而被删除。C#还撑持手工地定义 添加和删除块;添加和删除关于 代理恰似get和set关于 属性。

在C# 1.0和C# 1.1中,典型状况 下,我们把代理实例赋给工作 属性。例如,在WinForms中,一个Button控件暴露一个Click工作 。Click的代理类型是EventHandler。EventHandler是一个以对象和EventArgs为参数的方法。因此,我们可以用匹配代理EventHandler的签名的任何方法来初始化一个EventHandler对象并且把代理赋给Click。下面是该代码看上去的姿势:

private void Form1_Load(object sender, EventArgs e)

{ button1.Click += new EventHandler(OnClick);}

private void OnClick(object sender, EventArgs e)

{ Debug.WriteLine("button1 clicked");}

因为WinForms的表单设计器和WebForms的页面设计器主动 地添加代理绑定;所以,我们有可能不需要手工式地绑定代理而建立很多 的代码。

三、 匿名方法是内联代理

通常,当我们使用代理时,我们总是有一个方法。该方法的签名匹配代理的签名规则 并且能被用来初始化一个代理实例。匿名方法用于把方法和代理的初始化紧缩 到一个单一的方位 。

通过使用前一节的例子,我们已看到代理new EventHandler的实例化是怎样差异 于用来初始化该代理的方法OnClick的。这部分代码能被紧缩 成一个匿名方法:

private void Form1_Load(object sender, EventArgs e){

button1.Click += delegate

{

Debug.WriteLine("button1 clicked");

};

}

为了创建该匿名方法,请留意 我们删除了OnClick的方法头并且用OnClick的方法体的单词delegate代替 了EventHandler代理的构造器。其所导致的成绩行为是相同的。假如 我们想使用工作 参数,我们通常与代理相关联,我们可以在单词delegate之后添加一可选的参数列表:

private void Form1_Load(object sender, EventArgs e){

button1.Click += delegate(object s, EventArgs ev)

{ Debug.WriteLine("object is " + s.ToString()); };

}

假如 你定义 代理参数,它们有必要 匹配代理类型所定义 的参数。例如,Click的类型是EventHandler,因此假如 参数存在,它们有必要 匹配EventHandler的参数对象和EventArgs。

匿名方法可以被使用在任何需要使用代理的当地 。匿名方法能够使 用ref和out参数,但是 不能使用全局规模 的reference ref或out参数。匿名方法不能使用unsafe编码,并且匿名方法不能以使得分支行为跳出匿名方法的代码块的方式来使用goto,break或continue等语句。

四、 市场调查成绩

您可能还会对下面的文章感兴趣: