C# 使用以下语句有什么好处?

C# 使用以下语句有什么好处?,c#,default,C#,Default,最近,我遇到了以下几行: StringBuilder sb = default(StringBuilder); sb = new StringBuilder(); 我只想写这样的声明 使用默认(StringBuilder)语句有什么好处 根据所有的反馈,我提出了一个新问题 编辑: 你能看到这样做的优点或缺点吗?(它确实可以编译) 我相信我们正在研究是否存在范围问题,但最大的问题可能是对象没有正确初始化。你的想法是什么?一般来说,没什么。没有理由初始化变量,然后在下一行代码中设置它。你的第二句话

最近,我遇到了以下几行:

StringBuilder sb = default(StringBuilder);
sb = new StringBuilder();
我只想写这样的声明

使用默认(StringBuilder)语句有什么好处

根据所有的反馈,我提出了一个新问题

编辑: 你能看到这样做的优点或缺点吗?(它确实可以编译)


我相信我们正在研究是否存在范围问题,但最大的问题可能是对象没有正确初始化。你的想法是什么?

一般来说,没什么。没有理由初始化变量,然后在下一行代码中设置它。你的第二句话更清楚

拆分声明和赋值的理由很少。这通常仅在涉及范围界定问题时才需要,例如尝试在分配过程中使用异常处理:

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(《代码》)


如果不是这样的话,那么最好把它们放在一起。

没有任何好处;第二个代码段更简洁,可读性更强。

只有在开发一个可与参数化类型一起使用的泛型类时,才有使用
默认值的优势。有时,不知道该类型是引用类型、值类型还是结构。对于引用类型,
default
关键字返回
null
,对于数值类型返回
0


有关更多详细信息,请参见

默认关键字通常用于泛型类型的初始化,其中无法确定我们处理的是值类型(初始化为零)还是引用类型(初始化为空)。根据其他答案,在您提供的示例中,初始化StringBuilder并立即重新分配它,或者使用默认关键字,都没有什么意义

在.net 3.5中,您可能会遇到一个附加约定,即:

var sb = new StringBuilder();

在这里,sb的类型是从赋值的RHS推断出来的

我认为你的推理不正确,即使你的结论是正确的<代码>字符串生成器sb;请尝试{sb=GetAStringBuilder();}finally{Console.WriteLine(“in finally”);}如果(sb!=null){…}
这确实需要单独声明,但不需要单独初始化。在您的示例中需要单独初始化的原因是,如果未设置
sb
,则可以执行
if(sb!=null)
。@hvd Yes-这是我的观点-如果您对使用未初始化变量有局部作用域,则会遇到问题,除非您在“之前”进行初始化您的主要初始化。我要说的是,我没有在我前面的注释中的代码中初始化
sb
,也不需要初始化,即使我稍后在局部范围中为其赋值。注意
StringBuilder sb
之间缺少任何
=null
@hvd编译器会抱怨并在代码中提供关于使用未初始化变量的警告(在
中,如果(sb!=null)
),因为并非所有代码路径都将值设置为sb。不,它不会。如果未设置
sb
,则没有到达
if
的代码路径。你用了
catch
,我最后用了
。要么赋值成功,要么
GetAStringBuilder()
抛出异常,导致执行离开当前函数。您所说的是正确的,但不是问题的答案。无论
T
是否为值类型,
T=default(T);t=新的t()
总是可以写成
T=newt()。正确,只是我的目的是提供关于关键字的更全面的见解。感谢Vlad提供更多的见解,我在发布问题之前已经阅读了那篇文章。
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)  
{
    //...
var sb = new StringBuilder();