最近,我遇到了以下几行:
StringBuilder sb = default(StringBuilder);
sb = new StringBuilder();
我只想写一下像
这样的陈述StringBuilder sb = new StringBuilder();
使用默认(StringBuilder)语句有什么好处?
基于所有好的反馈,我提出了一个新问题。
修改 做这样的事情,你能看到优势或劣势吗? (它确实编译)
var sb = default(StringBuilder);
再次提到我相信我们正在考虑是否存在范围问题,但最大的问题可能是对象未正确初始化。你有什么想法?
答案 0 :(得分:4)
一般来说,没什么。没有理由初始化变量,然后在下一行代码中设置它。你的第二个陈述更清晰。
分割声明和作业的原因很少。这通常仅在涉及范围问题时才需要,例如尝试在赋值周围使用异常处理:
StringBuilder sb = null;
try
{
// Using a statement that may throw
sb = GetAStringBuilder();
}
catch
{
//...
}
// The compiler will warn about a potentially
// uninitalized variable here without the default assignment
if (sb != null)
{
//...
在这种情况下,您需要将两者分开,因为您在本地范围内进行了分配(try
)。
如果情况并非如此,那么最好将它们放在一起。
答案 1 :(得分:3)
没有任何优势;第二个片段更简洁,更易读。
答案 2 :(得分:2)
只有在开发使用参数化类型的泛型类时,才会出现使用default
的优点。有时,不知道类型是引用类型还是值类型或结构。 default
关键字为引用类型返回null
,为数值类型返回0
。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/xwth0h0d%28v=vs.80%29.aspx
答案 3 :(得分:2)
默认关键字通常与泛型类型的初始化一起使用,其中无法确定我们是处理值类型(初始化为例如零)还是引用类型(初始化为null)。根据其他答案,在您提供的示例中,无论是初始化StringBuilder还是立即重新分配它,也没有使用default关键字。
在.net 3.5中,您可能会遇到一个额外的约定,即:
var sb = new StringBuilder();
这里sb的类型是从赋值的RHS推断出来的。