【问题标题】:Why is this delegate syntax "legal"?为什么这个委托语法是“合法的”?
【发布时间】:2011-10-09 03:42:43
【问题描述】:

我正在阅读有关匿名方法的信息,并试图围绕这个示例展开:

List<int> evenNumbers = list.FindAll(delegate(int i)
{ return (i % 2) == 0; } )

为什么delegate(int i) 合法?您不必声明 new delegate void 或类似的东西。

这就是匿名方法的意思吗?这是允许匿名方法的附加语法糖吗?

【问题讨论】:

  • 自从你开始学习匿名方法以来,如果你还没有,你应该看看lambda expressions。我想你可能会觉得它们很有趣。
  • @Poma:谢谢!我接着说! :-)

标签: c# .net delegates anonymous-methods


【解决方案1】:

这是合法的,因为您怀疑它正在创建一个匿名委托/方法。

另一种选择(使用lambda operator =>)是:

List<int> evenNumbers = list.FindAll((i) => ((i % 2) == 0));

List<int> evenNumbers = list.FindAll(i => i % 2 == 0);

请参阅Lambda Expressions 以进一步阅读。

【讨论】:

  • 或者没有6个额外括号的相同内容。 :-) +1
  • 您可以通过删除所有括号来清理它:var evenNumbers = list.FindAll(i =&gt; i % 2 == 0);
  • 我把它们放在里面,这样你就可以更容易地看到直接翻译。
【解决方案2】:

如果你稍微分解一下语句,希望它会更明显 - 这是等效的代码。

Predicate<int> test = delegate(int i)
{
    return (i % 2) == 0;
};

List<int> evenNumbers = list.FindAll(test);

如您所见,它创建了一个匿名委托(编译器将在幕后变成一个方法)

就我个人而言,我一直发现“内联”匿名委托语法比增加清晰度更能解决问题,而使用 lambda 表达式构建的相同构造,一旦您习惯了语法,就会增加清晰度

List<int> evenNumbers = list.FindAll(i => i % 2 == 0);

【讨论】:

    【解决方案3】:

    在这段代码中,它看起来像是使用委托将方法传递给方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多