c# - 如何在不更改引用的情况下将两个字符串添加在一起

标签 c# string reference

与通过函数传递列表并向其中添加元素类似,我想传递一个字符串并向其中添加字符。但是,我不想更改引用。

Func(List myList) {
  myList.Append("hello");
}
Func(List myList) {
  myList = new List();
}

就像上面两个函数的区别一样。在一种情况下,您要将元素添加到对对象的现有引用中,在另一种情况下,您要更改所引用的对象。

对于字符串,我注意到您总是(?)更改引用的对象。我发现的每个解决方案都需要两个或多个字符串,将它们添加在一起并返回一个新字符串。

  • 有没有一种方法可以使用相同的字符串实例并向该特定实例添加一个或多个字符?

最佳答案

With strings, I have noticed you always(?) change the object that is referenced to.

因为字符串是不可变的。您无法更改 .NET 中的字符串。这为许多优化打开了大门(例如 string interning ),但当您想要按部分构建长字符串时,也会出现性能问题 - 许多内存分配和复制(要连接两个字符串,您必须在其中分配第三个字符串)两者加在一起的长度,然后复制它们)。

因此 Microsoft 创建了 System.Text.StringBuilder 。这个想法是创建可变字符串。基本方法是 Append() (附加一些数据,通常是原始类型)和 AppendFormat() (类似于 string.Format() )。然后通过调用 ToString() 获得一个普通字符串:

void Func(StringBuilder s)
{
    s.Append("Hi everyone!");
}

var s = new StringBuilder();
s.Append("a StringBuilder.");
Func(s);
s.ToString(); // "a StringBuilder.Hi everyone!"

关于c# - 如何在不更改引用的情况下将两个字符串添加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454832/

相关文章:

c++ - 函数参数的类型转换

c# - roslyn 编译器未使用 msbuild 复制到 AspnetCompileMerge 文件夹

c# - 使用 FileSystemWatcher 监视文件创建并在删除前复制它

c# - 如何创建 .net 4.5 monomac 项目?

java - 使用带有非空白正则表达式的 String split() 方法

.net - 如何制作 Visual Studio 项目文件来复制间接引用?

c# - 将 ExpandoObject 转换为类型,在客户端还是服务器端,哪个更高效、更省时?

C++:使用 std::string (&str[0]) 作为缓冲区从文件中安全读取?

c - C 计算字符串中字符数的函数

c++ - 引用对象的 STL 容器