是否有理由不将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执行而存在的意图,但如果它有问题,我不想这样做。
完全有效,看起来很聪明,我永远不会在代码中使用它供其他人使用。如果你和其他将要看这段代码的人都习惯了这种风格,我认为它没有问题。
职业:
- 清楚显示范围
- 非常实用的外观
反对:
- 函数变得更长(特别是如果你不使用K&R花括号样式)
- 非常非传统的c#代码。内联lambda现在到处都在使用,但是像这样的显式函数并没有被广泛使用。
- 可能无意中捕获外部函数的状态。
- 可能得到小的性能影响,不太可能被JIT内联。
我会在大多数语言中这样做,但c#除外。这种表示法(指定Func<>
类型,创建一个空的参数列表符号)看起来太笨拙了,而且不习惯。我宁愿有一个私有方法,即使这个方法在其他任何地方都没有意义。
如果将等效代码放入lambda而不是适当的方法中,则不会出现任何问题。可能有几件事你需要注意(例如,确保你不会意外地创建一个闭包),但假设重构本身没有引入错误,代码将运行得很好。
然而,在我看来,使用合适的方法与内联lambda的决定不应该基于该方法要使用的次数。我个人的原则是:
如果代码执行的函数范围较窄(例如,过滤集合的谓词),并且仅在该范围内有意义,则使用lambda——换句话说,如果它"处理真正小的打印"。如果代码所做的事情与包含它的类的高级功能相关,则将其放入适当的方法中。
没有,没有理由。使用Func
作为内联函数是完全合法的,如
一般来说;将其设置为"private"不会达到同样的效果吗?它会传达这样一种信息,即它不是用于外部消费的?
我认为你的方法是100%可以接受的。我在制作/团队环境中看到的最大问题是,人们(不熟悉它的人)会说它"令人困惑"。