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();