是否有理由不将Func用于一次性函数?

本文关键字:一次性 函数 用于 Func 有理由 是否 | 更新日期: 2023-09-27 17:54:20

我为什么要这么做呢

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

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

我想做后者,以便显示Bar仅为Baz执行而存在的意图,但如果它有问题,我不想这样做。

是否有理由不将Func用于一次性函数?

完全有效,看起来很聪明,我永远不会在代码中使用它供其他人使用。如果你和其他将要看这段代码的人都习惯了这种风格,我认为它没有问题。

职业:

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

反对:

  • 函数变得更长(特别是如果你不使用K&R花括号样式)
  • 非常非传统的c#代码。内联lambda现在到处都在使用,但是像这样的显式函数并没有被广泛使用。
  • 可能无意中捕获外部函数的状态。
  • 可能得到小的性能影响,不太可能被JIT内联。

我会在大多数语言中这样做,但c#除外。这种表示法(指定Func<>类型,创建一个空的参数列表符号)看起来太笨拙了,而且不习惯。我宁愿有一个私有方法,即使这个方法在其他任何地方都没有意义。

如果将等效代码放入lambda而不是适当的方法中,则不会出现任何问题。可能有几件事你需要注意(例如,确保你不会意外地创建一个闭包),但假设重构本身没有引入错误,代码将运行得很好。

然而,在我看来,使用合适的方法与内联lambda的决定不应该基于该方法要使用的次数。我个人的原则是:

如果代码执行的函数范围较窄(例如,过滤集合的谓词),并且仅在该范围内有意义,则使用lambda——换句话说,如果它"处理真正小的打印"。如果代码所做的事情与包含它的类的高级功能相关,则将其放入适当的方法中。

没有,没有理由。使用Func作为内联函数是完全合法的,如

一般来说;将其设置为"private"不会达到同样的效果吗?它会传达这样一种信息,即它不是用于外部消费的?

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