6

这个问题是我刚刚问的这个问题的答案的结果。

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

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

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

(编辑 - 那么在将值连接到字符串的循环之前初始化一个字符串变量怎么样""?或者这是在一个单独的类别中?

例如

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

)

4

5 回答 5

6

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

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

于 2010-05-05T14:39:35.213 回答
1

关于字符串循环,如果您将其更改为 StringBuilder ,您甚至不必考虑它。

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

于 2010-05-05T14:42:47.707 回答
0

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

IE

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

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

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

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

于 2010-05-05T14:37:53.033 回答
0

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

于 2010-05-05T14:39:04.027 回答
0

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

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

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

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

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

于 2010-05-05T14:47:24.460 回答