为什么WPF Presentation库在StringBuilder.ToString()中包装字符串?

Aim*_*ast 22 .net c# string wpf stringbuilder

在找到的代码PresentationCore.dll(.NET4 WPF)由ILSpy:

// MS.Internal.PresentationCore.BindUriHelper
internal static string UriToString(Uri uri)
{
    if (uri == null)
    {
        throw new ArgumentNullException("uri");
    }

    return new StringBuilder(uri.GetComponents(uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString, UriFormat.SafeUnescaped), 2083).ToString();
}
Run Code Online (Sandbox Code Playgroud)

返回类型uri.GetComponentsstring,为什么没有方法只返回string值而不是将它包装在一个StringBuilder(string).ToString();是这个设计?在一般意义上这样做的原因是什么?它会减少分配或改善垃圾收集还是用于线程安全?

Jay*_*Jay 1

我唯一能想到的是,如果传递到 stringBuilder 的第一个参数为 null,则 stringbuilder 将返回 string.empty 而不是 null (请参阅http://msdn.microsoft.com/en-us/library/zb91weab (v=vs.100).aspx )

虽然字符串可以为空...所以为什么要麻烦呢?!

自己进行检查并返回一个空字符串比新建 stringBuilder 实例要高效得多。

第二个参数只是字符串生成器应初始化为的建议大小...

对OP问题的评论是正确的,这似乎有点过分了。

  • 可能。当然,现在你可以只做 `return uri.GetComponents(uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString, UriFormat.SafeUnescaped) ?? "";` 但我认为 `Uri.GetComponents()` 无论如何都不能返回 null... (2认同)