这个问题是我刚才提出的this question答案的结果。
声称此代码“丑陋”,因为它将变量初始化为永远不会读取的值:
String tempName = null;
try{
tempName = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
FILE_NAME = tempName;
这确实是不好的做法吗?是否应该避免将变量初始化为永远不会实际使用的虚拟值?
(编辑 -
那么在将值连接到String的循环之前将String变量初始化为""
呢?或者这是一个单独的类别?
e.g。
String whatever = "";
for(String str : someCollection){
whatever += str;
}
)
答案 0 :(得分:6)
我认为将变量初始化为除非语言要求不会使用的值没有意义。
例如,在C#中,声明的字符串变量的默认值为null,因此您甚至无法通过显式写出来获取任何内容。它主要是一种样式选择,但由于字符串是不可变的,因此将其初始化为其他东西实际上会在内存中分配一个额外的字符串,无论如何都要扔掉。其他语言可能会有其他考虑因素。
答案 1 :(得分:1)
关于字符串循环,如果将其更改为StringBuilder,则甚至不必考虑它。
编辑:删除其他人更好的回答。
答案 2 :(得分:0)
作为一种做法,我倾向于避免将变量设置为任意值,而是将>>初始化为默认值。
即
int x = 0;
string name = "";
bool done = false;
Person randomGuy = null; //or = new Person();
我最喜欢这种方法,因为它为您的代码带来了一致性,同时又不会强迫下一个人来处理类似的事情:string name = "luke skywalker";
这更多是个人偏好,因此程序员之间会有所不同。
至少,您应该遵循项目设定的标准。您将了解遗留代码如何处理这些事情,并且最好能够符合这一点,因此整个系统的整体编码风格是相同的。
答案 3 :(得分:0)
这取决于编译器。 C#编译器要求在使用之前初始化变量。但CLR没有这个要求。在运行时,CLR验证变量是初始化还是否。如果不是,它将抛出一个nullreference异常。
答案 4 :(得分:0)
在我看来,将它称为“代码气味”可能更准确 - 在Martin Fowler的意义上。
我认为您不能单独更改默认初始化 - 它需要与其他重构方法一起使用。它还假设您已经重构了代码,因此您不需要临时变量:
try{
FILE_NAME = buildFileName();
//Do other stuff with file name
}
catch(Exception e){
...
System.exit(1);
}
然后它还假设这个代码段只是包含它的方法中的代码 - 即该方法只做一件事
当我编码时,我会担心我正在使用带有临时变量的虚拟值,但我只会在完成对该部分的编码时更改,并且它会按预期解决问题 - 并且只能与其他重构步骤一起使用。