Default value 将变量初始化为伪值是一种不好的做法吗?
这个问题是我刚才问的答案的结果 据称,该代码“丑陋”,因为它将变量初始化为一个永远不会被读取的值:Default value 将变量初始化为伪值是一种不好的做法吗?,default-value,variable-initialization,Default Value,Variable Initialization,这个问题是我刚才问的答案的结果 据称,该代码“丑陋”,因为它将变量初始化为一个永远不会被读取的值: String tempName = null; try{ tempName = buildFileName(); } catch(Exception e){ ... System.exit(1); } FILE_NAME = tempName; 这真的是坏习惯吗?应该避免将变量初始化为永远不会实际使用的伪值吗 (编辑- 在将值连接到字符串的循环之前,如何将字符串变量初始化
String tempName = null;
try{
tempName = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
FILE_NAME = tempName;
这真的是坏习惯吗?应该避免将变量初始化为永远不会实际使用的伪值吗
(编辑-
在将值连接到字符串的循环之前,如何将字符串变量初始化为“
”?或者这是一个单独的类别
e、 g
)作为一种实践,我倾向于避免将变量设置为任意值,而是将它们初始化为默认值 i、 e 我最喜欢这种方法,因为它给你的代码带来了一种一致性的感觉,同时又不会强迫下一个家伙去处理诸如:
string name=“luke skywalker”代码>
这更多的是个人偏好,因此程序员之间会有所不同
至少,您应该遵循项目设定的标准。您将了解遗留代码是如何处理这些事情的,并且最好遵守这些规则,这样整个系统的总体编码风格都是相同的。这取决于编译器。C#编译器要求在使用之前初始化变量。但CLR没有这一要求。在运行时,CLR验证变量是否已初始化或否。如果未初始化,则将引发nullreference异常 我认为没有必要将变量初始化为除非语言要求否则不会使用的值
例如,在C#中,声明的字符串变量的默认值为null,因此,通过显式地将其写出,您甚至不会获得任何结果。这主要是一种样式选择,但由于字符串是不可变的,因此将其初始化为其他类型实际上会在内存中分配一个额外的字符串,而您无论如何都会将其丢弃。其他语言可能会带来其他考虑。关于字符串循环,如果您将其改为StringBuilder,您甚至不必考虑它
编辑:删除的部分最好由其他人回答。在我看来,用马丁·福勒(Martin Fowler)这个词的意思来说,将其称为“代码气味”可能更准确
我不认为您可以单独更改默认初始化—它需要与其他重构方法结合使用。它还假设您已经重构了代码,因此不需要临时变量:
try{
FILE_NAME = buildFileName();
//Do other stuff with file name
}
catch(Exception e){
...
System.exit(1);
}
然后,它还假设该代码段是包含它的方法中的唯一代码,即该方法只做一件事
当我在编码时,我会担心我在临时变量中使用了伪值,但我只会在完成该部分的编码后进行更改,它会按照预期解决问题,并且只能与其他重构步骤结合使用。FYI,null+“您好”
仅编译和运行fine@zildjohn01-我刚试过,结果是字符串“nullhello”,你用Java吗?我在C#。。。在任何地方都没有看到语言标签。哦,是的。我使用的是Java,但没有给它加上标签,因为我的意思是这个问题与语言无关。只有在讨论成员变量时,C#示例才是正确的。局部变量没有默认值,必须先初始化才能读取(不过,正如Yogendra所写,这是C#要求,而不是CLR要求)。编译器会对此抱怨,所以我认为这符合“除非语言需要”的限制。无论如何,我完全同意你的观点,所以这是一个好的+1。
int x = 0;
string name = "";
bool done = false;
Person randomGuy = null; //or = new Person();
try{
FILE_NAME = buildFileName();
//Do other stuff with file name
}
catch(Exception e){
...
System.exit(1);
}