【问题标题】:Pass function as parameters vs setting a variable and passing it [closed]将函数作为参数传递与设置变量并传递它[关闭]
【发布时间】:2018-10-07 05:05:01
【问题描述】:

我敢打赌这个问题之前有人问过,但我真的不知道我在找什么,所以请提前原谅:)

这之间是否有区别(以编程方式或开销方式):

 var data = GetProducts();
 GetAllData(data);

还有这个:

GetAllData(GetProducts());

如果有的话,这两种方法的优缺点是什么?有没有更优雅/正确的方法来实现它(比如 Func)?

提前致谢, 罗特姆

【问题讨论】:

  • 取决于上下文 - 如果您只将 GetProducts 的结果用于这一个函数,那么两个调用都是等效的,归结为偏好(临时变量几乎肯定会被优化)
  • 基于意见投票结束。可能有几十甚至几百个原因,一个人可能更喜欢一个。
  • 有人能解释一下为什么我的问题被否决了吗?

标签: c# function overhead


【解决方案1】:

分两行进行调试更容易,因为您可以在第二行中断并观察在第一行分配的值。

无论如何,编译器都会将它们优化为相同的 CIL,因此这不是效率问题。这完全是一个偏好问题。

【讨论】:

    【解决方案2】:

    没有功能上的区别,当代码被翻译成机器语言(或 JVM 字节码或其他)时,它会产生或多或少相同的低级代码。

    主要区别在于 (a) 美观和 (b) 代码的可维护性。关于美学,有些人可能会认为第二种形式更漂亮。这在很大程度上是个人选择,但我认为如果表达式不像 GetProducts() 那样简单而是很长(例如 GetContext().GetProductService().GetProductsFor(GetContext().GetCurrentUser()),那么使用中间变量将其分成两行更具可读性。

    关于可维护性,我认为您会发现变量越少越有利于​​未来的维护。您不太可能遇到与副作用或更改假设相关的错误。在其他语言中,您可以使用 constfinal 之类的结构来使用编译器来帮助防止代码腐烂,但我仍然认为代码行数越少越好。

    希望这会有所帮助!

    【讨论】:

    • " 如果您使用 const 而不是 var" - 您不能将 var 替换为 const,这根本无法编译。而const 需要 C# 中的编译时间常数
    • 是的,该评论并非针对 C#,而是针对使用许多语言提供的编译器构造的一般评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2021-04-13
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多