【问题标题】:Initializing a variable and passing it as a parameter vs initializing in method body [closed]初始化变量并将其作为参数传递与在方法主体中初始化[关闭]
【发布时间】:2021-11-17 18:16:13
【问题描述】:

在 C# 中,有谁知道是否这样做...

 public object Foo()
 {
    var command = new MyCommand(param1);
    return Myfunction(command);
 }

比这样做效率低(使用更多内存)?

 public object Foo()
 {
    return Myfunction(new MyCommand(param1));
 }

还是只是表面上的区别?似乎第一个选项会消耗更多内存,直到变量超出范围。我意识到任何差异都会非常小。另外,第二种语法有名称吗?排队?某物?谢谢!

【问题讨论】:

  • 智能编译器会同时优化对象并生成相似的代码。
  • 在这两种情况下都必须为对象分配内存。应该没有区别。
  • "Inline" 是合适的,是的。编译后的代码可能没有区别,并且对象在两种情况下都会保持相同的状态(直到 Myfunction 完成),因此“范围”是相同的
  • 请将您的示例代码复制粘贴到sharplab 并打开右侧面板上的IL 以查看差异

标签: c# variables


【解决方案1】:

对于编译器来说,是完全一样的。两者都将转换为相同的 IL 代码。

要记住两件事。

首先,您的代码的可读性如何?使用单个变量看起来不错,但是如果您传入多个变量或执行嵌套函数调用(如return Myfunction(new MyCommand(MyOtherFunction(MyThirdFunction(param1))));)会发生什么?从技术上讲,这是正确的,但它使阅读和理解变得更加困难。

第二,调试有多容易?如果您的commandnull,会发生什么情况。你需要检查它,如果是,在哪里?根据param1,您可能不知道该命令的值,直到您的代码更进一步,所以如果出现问题,可能更难找到哪里。

 public object Foo()
 {
    var command = new MyCommand(param1); // what happens if param1 is invalid?
    
    if (command != null) // yes, this can be done on one line
    {
        return MyFunction(command);
    }
    else
    {
        throw new ArgumentException("Bad command"), ex);
    }
 }

【讨论】:

    【解决方案2】:

    没有区别。编译器会将command 变量优化掉。

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 2018-01-10
      • 2023-03-06
      • 2021-11-27
      • 2017-02-23
      • 2015-05-17
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多