【问题标题】:Difference in coding style [duplicate]编码风格的差异[重复]
【发布时间】:2013-07-07 08:39:10
【问题描述】:

以下代码之间是否有任何显着差异:

for(int i=0;i<100;i++){
   int s =i;
}

int s=0;
for(int i=0;i<100;i++){
   s =i;
}

【问题讨论】:

  • 为了他人的爱,请学会在 if 语句中使用分号后的空格。实际上,变量名、赋值运算符和赋值值之间的空格也不会太糟糕!谁在教 'for(' 是好的风格?'for' 是一个关键字,你不应该让它看起来像一个方法调用。

标签: java


【解决方案1】:

以下代码之间是否有任何显着差异:

只是int s的范围不同。以前,它在 for 循环之外是不可见的。然而,它会在后一种情况下。就最佳实践而言,您应该尽量尽量减少局部变量的范围。所以,如果你没有在for 循环之外使用int s,那么最好只在内部声明它。

【讨论】:

  • 除了“范围问题”之外,“int s=i”是否会一次又一次地重新初始化 s。如果'int s'在外面,它将被避免。
  • @Manish。在第二种情况下,s 将在每个循环中重新初始化。在第一种情况下,您完全重新声明了变量。
  • 那么're-initialized'和're-declaring'有什么区别呢?如果处理一个大循环会不会有问题
  • @Manish。当然,一旦循环结束,String 对象就有资格进行垃圾收集,但这并不能保证在那个实例上它会被垃圾收集。
  • so in case of 'String' 1. String s = value inside loop or 2 String s=null out of loop and s=value inside loop你会喜欢哪个。
【解决方案2】:

如果在循环之外没有使用 s 那么我更喜欢第一个

for(int i=0;i<100;i++){
   String s =i;
}

因为

局部变量的范围应始终尽可能小

因为

  • 这使代码更易于理解、调试和重构。
  • 这两种情况下这些变量所需的内存都非常小。

除此之外,这两者之间没有太大区别

详细答案可以查看this so thread

【讨论】:

  • -1。我对此感到困惑 - 为什么将 String s outside 声明为 for 循环(“如果在循环之外没有使用 s”)会导致 更小 i> 范围?这不是倒退吗?
  • @CraigOtis ..oops 我根据第一个写了答案...抱歉错误...复制粘贴问题
【解决方案3】:

第一个更好。程序员知道该变量不会影响外部范围内的其他事物。

编译器也知道这一点,所以它可以做一些优化,例如

void foo()
{

    for(int i=0;i<100;i++)
    {
        String s = ""+i;
    }

    for(int i=0;i<100;i++)
    {
        Long x = i;
    }
}

sx 只需要一个本地堆栈槽,因为永远不会同时需要sx

如果sx 在外部范围内,编译器就不会那么明显了

void foo()
{
    String s;
    Long x;

    for(int i=0;i<100;i++)
    {
        s = ""+i;
    }

    for(int i=0;i<100;i++)
    {
        x = i;
    }
}

【讨论】:

    【解决方案4】:

    正如其他人所提到的,唯一的功能区别是范围。在for 循环外声明的字符串,可以在循环外访问。在循环内声明,只能在循环内访问。

    然而,它还有一点:当你让一个变量在循环外访问时,你暗示它需要在循环外访问。因此,如果在该方法的后面访问它,这可能会在您的代码读者心中提出一个问题,即您是否忘记使用它,或者暗示是否不正确。因此,如果您声明字符串以使其范围尽可能多地限制在何时/何地使用,则它更具可读性。

    【讨论】:

      【解决方案5】:

      通过在for 循环内声明int,其范围由for 循环定义。因此,它将在循环之外不可用。

      此外,您在前一个循环的每次迭代中不断重新声明和初始化 int,而不是仅在循环中重新初始化 int后一个例子。如果您不打算在循环之外使用变量,那么前一种方法可能有意义。

      【讨论】:

        【解决方案6】:

        我在两个代码中看到的唯一区别是,在第一个示例中,String s 将在 for 循环中是本地的。在第二个例子中,String 也可以在循环外访问。

        【讨论】:

          【解决方案7】:

          s 不仅只在第二个循环中可见,更重要的是,每次循环运行都会实例化一个新的s。你可能想要这个,你可能不想要。新的实例化会产生性能成本,但如果您想确保在离开循环后对其进行垃圾回收并且不尝试在其他地方访问它,则更安全。

          【讨论】:

          • 这里没有实例化,两个sn-ps之间很可能没有性能差异。
          猜你喜欢
          • 2016-03-21
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-08
          • 2016-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多