【问题标题】:Is it bad practice to initialize a variable to a dummy value?将变量初始化为虚拟值是不好的做法吗?
【发布时间】:2026-02-03 04:10:01
【问题描述】:

这个问题是我刚才对this question 的回答的结果。

有人声称这段代码“丑陋”,因为它将一个变量初始化为一个永远不会被读取的值:

String tempName = null;
try{
    tempName = buildFileName();
}
catch(Exception e){
    ...
    System.exit(1);
}
FILE_NAME = tempName;

这确实是不好的做法吗?是否应该避免将变量初始化为永远不会实际使用的虚拟值?

(编辑- 在将值连接到字符串的循环之前将字符串变量初始化为"" 怎么样?还是属于单独的类别?

例如

String whatever = "";
for(String str : someCollection){
   whatever += str;
}

)

【问题讨论】:

  • 仅供参考,null + "hello" 编译并运行得很好
  • @zildjohn01 - 我刚试了一下,结果得到了字符串“nullhello”
  • 你在使用 Java 吗?我在 C# 中...在任何地方都没有看到语言标签。
  • 哦,真的。我使用的是 Java,但没有标记它,因为我的意思是问题与语言无关

标签: default-value variable-initialization


【解决方案1】:

关于字符串循环,如果你把它改成 StringBuilder 就不用考虑了。

编辑:其他人更好地回答的删除位。

【讨论】:

    【解决方案2】:

    在我看来,将其称为“代码气味”可能更准确——在 Martin Fowler 的意义上。

    我认为您不能单独更改默认初始化 - 它需要与其他重构方法结合使用。它还假设您已经重构了代码,因此您不需要临时变量:

    try{  
        FILE_NAME = buildFileName();  
        //Do other stuff with file name
    }  
    catch(Exception e){  
        ...  
        System.exit(1);  
    } 
    

    然后它还假设此代码段只是包含它的方法中的代码 - 即该方法只做一件事

    当我编码时,我会担心我正在使用带有临时变量的虚拟值,但我只会在我完成对该部分的编码并且它按预期解决问题时才会更改 - 并且只能与其他重构步骤结合使用。

    【讨论】:

      【解决方案3】:

      我认为将变量初始化为除非语言要求否则不会使用的值是没有意义的。

      例如,在 C# 中,声明的字符串变量的默认值为 null,因此您甚至不会通过显式写出它来获得任何东西。这主要是一种样式选择,但是由于字符串是不可变的,因此将其初始化为其他内容实际上会在内存中分配一个额外的字符串,无论如何您都会将其丢弃。其他语言可能会带来其他考虑。

      【讨论】:

      • 您的 C# 示例仅在您谈论 成员变量 时才是正确的。局部变量没有默认值,必须在读取之前对其进行初始化(不过,正如 Yogendra 所写,这是 C# 要求,而不是 CLR 要求)。不过,编译器会抱怨这一点,所以我认为这符合您的“除非语言要求”限制。无论如何,不​​能更同意你提出的实际观点,所以这是一个很好的 +1。
      【解决方案4】:

      这取决于编译器。 C# 编译器要求变量在使用前进行初始化。但是CLR没有这个要求。在运行时,CLR 验证变量是否已初始化。如果不是,它将抛出一个空引用异常。

      【讨论】:

        【解决方案5】:

        作为一种习惯,我倾向于避免将变量设置为任意值,而是将它们初始化为默认值。

        int x = 0;
        string name = "";
        bool done = false;
        Person randomGuy = null; //or = new Person();
        

        我最喜欢这种方法,因为它为您的代码带来了统一感,同时又不会强迫下一个出现的人处理以下内容:string name = "luke skywalker";

        这更多是个人喜好,因此程序员之间会有所不同。

        至少,您应该遵循项目设定的标准。您将了解遗留代码如何处理这些事情,并且最好遵循这一点,这样整个系统的整体编码风格都是相同的。

        【讨论】:

          最近更新 更多