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

对C#2.0中匿名方法的怀疑分析,第1张

对C#2.0中匿名方法的怀疑分析,第2张

一.导言

所有的方法都使用同一集合中元素的子集。在C# 2.0中,可选元素的集合将继续增长。历史上——除了C++内联方法——方法需要名称、返回类型和方法体。或者,该方法可以使用访问修饰符和参数列表。在C# 2.0中,方法名已经从必需的改为可选的。

C# 2.0(通常代表。net)引入了匿名方法。在任何使用代理并且代理被定义为内联的情况下,都可以使用匿名方法。它不需要方法名,但是有可选参数和方法体。

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

二、机构审查

匿名是一种声明和使用代理的压缩方法(如果你还对什么是代理有疑问,请继续阅读;否则,您可以跳过下面的这一部分)。代理,作为指向函数签名的指针,在语言之前就存在了。网。记住,计算机中的一切实际上都是比特和字节。通过引入函数指针技术,可以动态地将一些未来未知的函数赋给指针,事件由此诞生。

使用函数指针的基本方法是将函数的地址分配给一个指针。为了通过一个指针调用这个函数,程序员要检查一下,确定这个指针是否为空,然后通过这个指针间接调用这个函数。总之,要使用指针,必须进行空检查,现在“一个指针对应一个函数”这种限制应该结束了。

回过头来看,代理将成为原函数指针的下一个进化替代者。代理是封装指针的类;隐式地,代理在。NET是一个多播代理。做组播代理只是意味着“一个函数对应一个指针”的限制不再存在,因为组播代理类包含了一个指针列表。包含内部列表意味着可以将多个函数的地址分配给单个代理。当代理(您可以把它看作一个“事件”)被触发或调用时,所有内部列表函数都会被调用。

注意,在C#中,我们调用代理就像我们过去调用方法和所有赋值函数一样;但是我们仍然可以检查null。在visual Basic.NET中,空检查隐含在激活事件行为中。

在C#中,函数地址通过使用重载的+=运算符插入到列表中,并通过重载的-=运算符删除。# C还支持手动定义添加和删除块;添加和删除就像获取和设置代理的属性一样。

在C# 1.0和C# 1.1中,我们通常将代理实例分配给事件属性。例如,在WinForms中,Button控件公开一个Click事件。Click的代理类型是EventHandler。EventHandler是一个以object和EventArgs作为参数的方法。因此,我们可以通过任何匹配代理EventHandler签名的方法来初始化EventHandler对象,并将代理分配给Click。代码如下所示:

private void Form1_Load(对象发送方,EventArgs e)
{ button1。click+= new EventHandler(OnClick);}
private void OnClick(对象发送方,EventArgs e)
{ Debug。WriteLine(" button 1 clicked ");}

因为WinForms的表单设计器和WebForms的页面设计器自动添加代理绑定;所以,我们有可能不用手动绑定代理就可以构建很多代码。

第三,匿名方法是内联代理。

通常,当我们使用代理时,我们总是有一个方法。此方法的签名与代理的签名规则相匹配,可用于初始化代理实例。匿名方法用于将方法和代理的初始化压缩到一个位置。

使用上一节中的示例,我们已经看到了代理new EventHandler的实例化如何不同于用于初始化代理的OnClick方法。这部分代码可以压缩成一个匿名方法:

private void Form1_Load(对象发送方,EventArgs e){
button1。单击+=委托
{
调试。WriteLine(" button 1 clicked ");
};
}

要创建这个匿名方法,请注意我们删除了OnClick的方法头,用OnClick的方法体的delegate这个词替换了EventHandler代理的构造函数。结果是一样的。如果我们想要使用事件参数,我们通常与代理相关联,并且我们可以在单词delegate之后添加可选的参数列表:

private void Form1_Load(对象发送方,EventArgs e){
button1。Click += delegate(object s,EventArgs ev)
{ Debug。WriteLine(" object is "+s . ToString());};
}

如果定义代理参数,它们必须与代理类型定义的参数匹配。例如,点击的类型是EventHandler,所以如果参数存在,它们必须与EventHandler和EventArgs的参数对象相匹配。

匿名方法可以用在任何需要使用代理的地方。匿名方法可以使用ref和out参数,但不能使用全局引用ref或out参数。匿名方法不能使用不安全的编码,匿名方法不能以分支行为跳出匿名方法代码块的方式使用goto、break或continue语句。

四。市场调查结果

匿名是好事吗?市场调研证明匿名方法确实不错,因为可以减少实例化代理和减少分离方法带来的代码开销。此外,市场研究也证明了匿名方法增强了可用性和可维护性。我认为一个好名字的方法也可以实现这一点。请看下面的代码。容易维护吗?

private void Form1_Load(对象发送方,EventArgs e)
{
bind click(委托{调试。WriteLine(" button 1 click ");});
}
private void bind click(EventHandler)
{
button 1。Click +=处理程序;
}

在这个例子中,我们将代理传递给一个方法——通过将代理作为匿名方法传递。光是保持括号、分号、方括号的顺序和数量就很头疼。

如果引用经典的例子,匿名方法只是通过消除线程(它们使用代理)来减少创建代理和方法的开销。这是真的,但是线程并不经常使用,正确使用它们是非常困难的。我想知道让代码更秘密而不是更公开是多么谨慎。

就语言而言,我喜欢方法;但是作为一个正在开发中的实际事物,匿名方法可能只是证明微软的一个发明者有点太聪明了。

动词 (verb的缩写)摘要

匿名方法证明了可以有没有名字的方法——它们可以在任何可以使用代理的地方被定义和使用。代理是事件处理程序的包装。匿名方式的实用性和通用性如何,还需要进一步的实践来证明。我怀疑匿名方法不会比操作符重载有更大的用处,它们的使用会很少;但是匿名方法现在是。NET,所以在阅读代码时有必要识别它们。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 对C#2.0中匿名方法的怀疑分析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情