String 或 StringBuilder 返回值?

2024-01-19

如果我在方法中使用 StringBuilder 对象构建字符串,那么以下操作是否有意义:

返回StringBuilder对象,并让调用代码调用ToString()?

return sb;

或者通过自己调用 ToString() 返回字符串。

return sb.ToString();

我想如果我们返回小字符串或大字符串,这会有所不同。每种情况下什么是合适的?提前致谢。

编辑: 我不打算进一步修改调用代码中的字符串,但 Colin Burnett 说得好。

主要是返回StringBuilder对象和字符串哪个效率更高?是否会返回对字符串的引用或副本?


如果要进一步修改字符串,则返回 StringBuilder,否则返回字符串。这是一个API问题。

关于效率。由于这是一个模糊/笼统的问题,没有任何具体细节,所以我认为可变与不可变比性能更重要。可变性是让 API 返回可修改对象的 API 问题。字符串长度与此无关。

就是这样说的。如果您使用 Reflector 查看 StringBuilder.ToString:

public override string ToString()
{
    string stringValue = this.m_StringValue;
    if (this.m_currentThread != Thread.InternalGetCurrentThread())
    {
        return string.InternalCopy(stringValue);
    }
    if ((2 * stringValue.Length) < stringValue.ArrayLength)
    {
        return string.InternalCopy(stringValue);
    }
    stringValue.ClearPostNullChar();
    this.m_currentThread = IntPtr.Zero;
    return stringValue;
}

你可以看到它可能会制作一个副本,但如果你用 StringBuilder 修改它,那么它就会制作一个副本(这就是我可以告诉 m_currentThread 的点是因为 Append 会检查它,如果它与当前线程不匹配,则会复制它) 。

我想最终的结果是,如果您不修改 StringBuilder,那么您就不会复制字符串,并且长度与效率无关(除非您遇到第二个 if)。

UPDATE

System.String 是一个类,这意味着它是一个引用类型(而不是值类型),因此“string foo;”本质上是一个指针。 (当您将字符串传递给方法时,它传递的是指针,而不是副本。)System.String 在 mscorlib 内部是可变的,但在其外部是不可变的,这就是 StringBuilder 操作字符串的方式。

因此,当调用 ToString() 时,它会通过引用返回其内部字符串对象。此时您无法修改它,因为您的代码不在 mscorlib 中。通过将 m_currentThread 字段设置为零,然后对 StringBuilder 的任何进一步操作都将导致它复制字符串对象,以便可以对其进行修改and不修改 ToString() 中返回的字符串对象。考虑一下:

StringBuilder sb = new StringBuilder();
sb.Append("Hello ");

string foo = sb.ToString();

sb.Append("World");

string bar = sb.ToString();

如果 StringBuilder 没有进行复制,那么最后 foo 将是“Hello World”,因为 StringBuilder 修改了它。但既然它确实复制了,那么 foo 仍然只是“Hello”,而 bar 是“Hello World”。

这是否澄清了整个返回/参考的事情?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String 或 StringBuilder 返回值? 的相关文章

随机推荐

  • 如何在运行时通过脚本检查 PowerShell 中是否存在 cmdlet

    我有一个需要在多个主机 PowerGUI PowerShell ISE https technet microsoft com en us library dd315244 aspx等 但我遇到一个问题 有时其中一台主机下不存在 cmdle
  • 在 Maven 中,为什么运行“mvn clean”?

    我想知道跑步之间的主要区别是什么mvn compile and mvn clean compile是 在实践中 我明白真正的区别是什么mvn clean compile删除所有生成的文件并从头开始 但我们为什么要这样做呢 我可以假设mvn
  • WSDL.exe - 生成接口以及具体类,以便以后轻松进行伪造/模拟

    当 WSDL exe 生成 Web 服务的代理时 是否可以让 WSDL exe 生成接口以及具体类 或者代替具体类 我们正在使用来自 ASP Net 应用程序的第 3 方 Web 服务 并使用 WSDL exe 生成了我们的代理类 一切都很
  • 核心数据多级父-子上下文

    在我的应用程序中我有UITableViewController显示事件列表 该控制器使用 ManagedObjectContext 说ParentContext 现在 如果选择任何事件 则会显示详细的视图控制器 用户可以在其中编辑事件的详细
  • 无法使用 PhantomJS 加载页面资源

    我正在使用 PhantomJS 获取给定 URL 的页面内容 问题是在某些页面上 PhantomJS 无法加载某些资源 js css 我收到的错误是 错误代码 5 操作取消 我可以重现此问题的网页是www lifehacker com ht
  • Django Rest Framework 中 CreateAPIView 的权限

    我查看了 CreateAPIView 的代码 发现创建过程中没有任何地方检查权限 所以我决定检查它们perform create挂钩如下 class CourseList generics CreateAPIView Create a co
  • 浮动元素被前一个元素按下

    http jsfiddle net 4gw8wank http jsfiddle net 4gw8wank 我有 3 个容器作为响应式页面的一部分 在移动视图中 它们必须按顺序显示 蓝色 红色 绿色 像这样堆叠在一起 div class b
  • 如何删除警告:“-pie 被忽略。它仅在链接主可执行文件时使用”

    自从更新到 Xcode10 和 Swift 4 2 以来 我总是在我的 pod 中收到此构建时间警告 我需要做什么才能删除这些警告 我尝试删除派生数据 清理并构建项目 但它不起作用 我发现有人在这里问同样的问题https github co
  • 保持对管道运算符之间的变量的访问

    我一直在尝试在节点应用程序中使用 Rxjs fileList 是从返回fs readdirsync 字符串数组 首先map 有一个称为文件名的参数 flatMap readFileAsObservable uses bindNodeCall
  • Azure 数据工厂:如何在另一个管道成功完成后触发管道

    在 Azure 数据工厂中 如何在其他管道成功完成后触发管道 详细地 我试图在其他管道成功完成后触发 SSIS 包 我已经知道我可以将 SSIS 包保存为管道 并像其他管道一样使用触发器运行它 但是如何确保 SSIS 包管道仅在其他管道完成
  • 从服务器端查找 HttpRequest 中的时区

    我努力了var dateHeaders HttpContext Current Request Headers Date 但它包含 null 显然没有这样的键 谁能告诉我还能在哪里找到当前客户的时区 参考 http en wikipedia
  • 让 CSS 插入框阴影出现在内部背景之上

    我希望 CSS 插入框阴影出现在带有框阴影的容器内元素的顶部 特别是子元素的背景颜色 Demo http jsfiddle net Q8n77 http jsfiddle net Q8n77 div class parent foo div
  • C# 面板列表

    我想创建包含有关某个项目的详细信息的面板 包括左侧的缩略图 然后将它们添加到可滚动列表中 与 iPhone 上的 iTunes 显示可用应用程序列表的方式非常相似 我已经进行了一些搜索 但迄今为止尚未找到任何帮助 有谁有任何想法或样本链接想
  • Bing 拼写检查 API 是否对 mode = 拼写有额外的长度限制?

    The Bing 拼写检查 API https msdn microsoft com en us library mt711411 aspx对于请求想要进行拼写检查 mode spell 或校对 mode proof default 的文本
  • 后备机制 - 最佳方法?

    我有三种不同类型的服务器连接 这些可以在属性文件中配置 假设有三台服务器 Server1 Server2 Server3 In Properties文件 我的配置如下 ServerPref1 Server1 ServerPref2 Serv
  • 如何使用 Spark-Submit 和 pyspark 运行 luigi 任务

    我有一个luigipython 任务 其中包括一些 pyspark 库 现在我想用spark submit在mesos上提交这个任务 我应该做什么来运行它 下面是我的代码框架 from pyspark sql import function
  • UIBarStyleBlack 与 TintColor 黑色

    设置和设置有什么区别tintColor的财产UINavigationBar to UIColor blackColor 和设置barStyle to UIBarStyleBlack在不透明的导航栏上 有一些细微的差别 例如 在 iPad 上
  • C#中如何从字符串中获取数字

    我在 HTML 中有一个字符串 3 Trip 中的 1 3 如何获取数字 3 在 trip 之前 并将其转换为 int 我想将其用作计数 找到了这段代码 public static string GetNumberFromStr strin
  • Fail2ban - 为 docker-container 日志创建第二个 sshd-jail 不起作用

    我有一个运行 Ubuntu 18 04 3 的 Linux 机器 并且有一个有效的 fail2ban 配置 就像在我的所有主机上一样 在本例中 我设置了一个 docker container 它充当多个用户的 sftp 服务器 docker
  • String 或 StringBuilder 返回值?

    如果我在方法中使用 StringBuilder 对象构建字符串 那么以下操作是否有意义 返回StringBuilder对象 并让调用代码调用ToString return sb 或者通过自己调用 ToString 返回字符串 return