是否有理由不将Func用于一个off函数?

时间:2011-04-29 15:29:02

标签: c#

我有理由这样做吗

public class Foo {
  int Bar() {
    return 1;
  }
  public void Baz() {
     int bar = Bar();
     // do other stuff
  }
}

VS

public class Foo {
  public void Baz() {
    Func<int> Bar = ()=> {
      return 1;
    };
    int bar = Bar();
    // do other stuff
  }
}

我想做后者是为了表明Bar只存在于Baz执行的意图,但如果有问题我不想这样做。

5 个答案:

答案 0 :(得分:2)

完全虚荣,看起来很聪明,我绝不会在代码中使用它以供其他人使用。如果你和其他任何人都在看这个代码都习惯了这种风格,我发现它没有任何问题。

临:

  • 清楚地显示范围
  • 非常实用的外观

缺点:

  • 功能变得更长(特别是如果你不使用K&amp; R花括号样式)
  • 非常传统的C#代码。内联lambda现在无处不在,但是这样的显式函数并没有被广泛使用。
  • 可能无意中从外部功能捕获状态。
  • Likley获得了小小的性能,并且JIT将内部联合起来。

答案 1 :(得分:1)

我会在大多数语言中这样做,但不是C#。符号(指定Func<>类型,制作一个空的参数列表sigil)看起来太笨重了,而且它不是惯用的。我希望有一个私有方法,即使该方法在其他任何地方都没有意义。

答案 2 :(得分:1)

如果将等效代码放在lambda而不是正确的方法中,则不会有任何问题。您可能需要注意一些事项(例如,确保您不会意外地创建闭包),但假设重构本身不会引入错误,代码也会运行。

然而,恕我直言,决定使用适当的方法与内联lambda不应该基于该方法的使用次数。我个人的规则是:

如果代码执行窄范围的函数(例如,过滤集合的谓词)并且仅在该范围内有意义,则使用lambda - 换句话说,如果它“处理非常小的打印”。如果代码执行与包含它的类的高级功能相关的内容,请将其置于适当的方法中。

答案 3 :(得分:0)

没有理由。将Func s用作内联函数(

)是完全合法的

答案 4 :(得分:0)

一般来说;不会把它设置为'私人'完成同样的事情?它会传达出它不打算用于外部消费的想法吗?

我认为你的方法是100%可以接受的。我在生产/团队环境中看到的最大问题是人们(不熟悉它)会说它“令人困惑”。