哪种方法正确?为什么?
string initializeme = string.Empty;
StringBuilder AppendToMe = new StringBuilder();
for(int i=0; i < 10; i++)
{
initializeme = string.Empty; //Is this the right place to initialize?
if(expressionThatEvalsTrue)
initializeme = SomeMethodReturningString();
if(!string.IsNullOrEmpty(initializeme)
AppendToMe.Append(initializeme);
}
或
string initializeme = string.Empty;
StringBuilder AppendToMe = new StringBuilder();
for(int i=0; i < 10; i++)
{
if(expressionThatEvalsTrue)
initializeme = SomeMethodReturningString();
if(!string.IsNullOrEmpty(initializeme)
AppendToMe.Append(initializeme);
initializeme = string.Empty; //Is this the right place to initialize?
}
答案 0 :(得分:5)
这里有三个因素:
我通常在尽可能小的范围内声明变量,并尝试立即初始化它们:
for(int i=0; i < 10; i++)
{
string initializeme = expression ? SomeMethodReturningString() : "";
Console.WriteLine(initializeme);
}
答案 1 :(得分:3)
我更喜欢这个:
for(int i=0; i<10; i++)
{
var initializeme = expression
? SomeMethodReturningString()
: string.Empty;
Console.WriteLine(initializeme);
}
我更喜欢这种风格的原因是它是自包含的:变量只在一个地方设置。在循环内部进行操作也会减少变量的范围,这也是首选。我喜欢在这种情况下使用额外变量,因为使用三元运算符作为参数IMO会使函数调用的可读性降低。
答案 2 :(得分:2)
现代编译器将代码转换为静态单一赋值形式,其中每个变量只分配一次,因此没有理由不在方便时声明新变量,就像在循环的每次迭代中一样。
答案 3 :(得分:1)
最好的方法就是这样:
for (int i = 0; i < 10; i++)
{
string initializeme = string.Empty;
if (expressionThatEvalsFalse)
initializeme = SomeMethodReturningString();
Console.WriteLine(initializeme);
}
如果在循环外使用initializeme
,则需要在循环外声明它。
答案 4 :(得分:1)
我会在循环中声明变量,并假设编译器足够智能,不会从中创建慢速代码:
for(int i=0; i<10; i++)
{
string initializeme = string.Empty;
if(expressionThatEvalsFalse)
initializeme = SomeMethodReturningString();
Console.WriteLine(initializeme);
}
答案 5 :(得分:0)
循环完成后你会使用这个变量吗?我能看到的唯一区别是,如果你需要保留该变量的最后一个值,那么第一个值会保留,而第二个值则不会。
答案 6 :(得分:0)
在代码片段中,我认为没有理由首先进行初始化。在初始化可能初始化为值(片段一)或空字符串(片段二)的循环之后,两个片段将不同。因此下面代码的前提是您只需要循环中的initializeme
StringBuilder AppendToMe = new StringBuilder();
for(int i=0; i < 10; i++)
{
if(expressionThatEvalsTrue)
AppendToMe.Append(SomeMethodReturningString());
}
答案 7 :(得分:0)
在我看来都不是。在这两种情况下,我都会做以下事情。
替换
initializeme = string.Empty; //Is this the right place to initialize?
if(expressionThatEvalsTrue)
initializeme = SomeMethodReturningString();
使用
initializeme = expressionThatEvalsTrue ?
SomeMethodReturningString() : string.Empty
这样,如果你的expressionThatEvalsTrue为true,你将从方法中获取字符串,否则它将被设置为空白。