如何在C#中使用字符串正常工作?

Lir*_*man 3 c# string

我知道C#中有一个关于字符串的规则说:

当我们创建一个string类型的文本字符串时,我们永远不能改变它的值!当为字符串变量赋予不同的值时,第一个字符串将保留在内存和变量(这是一种引用类型)中,只获取新字符串的地址.

所以做这样的事情:

string a = "aaa";
a = a.Trim(); // Creates a new string
Run Code Online (Sandbox Code Playgroud)

不推荐.但是,如果我需要根据用户偏好对字符串执行某些操作,如下所示:

string a = "aaa";
if (doTrim)
   a = a.Trim();
if (doSubstring)
   a = a.Substring(...);

etc...
Run Code Online (Sandbox Code Playgroud)

如果不在每个动作上创建新的字符串,我怎么能这样做呢?我想通过ref将字符串发送到函数,如下所示:

void DoTrim(ref string value)
{
  value = value.Trim(); // also creates new string
}
Run Code Online (Sandbox Code Playgroud)

但这也创造了一个新的字符串...有人可以告诉我,如果有一种方法可以做到这一点而不浪费每个动作的记忆?

Ser*_*rvy 11

你是正确的,因为你正在执行的操作是创建新字符串,而不是改变单个字符串.

你错了,因为这通常是有问题的,或者是要避免的.

如果你的字符串是成千上万的字符,那么肯定,复制所有这些只是为了删除一些前导空格,或者在它的末尾添加几个字符(特别是在循环中),实际上可能是问题.

如果你的字符串不大,并且你没有对字符串执行很多(数千个)操作,那么你几乎肯定没有问题.

现在有上下文,通常相当罕见,是极少数运行与字符串操作的问题.可能最常见的有问题的上下文是将一串字符串附加在一起,因为这样做意味着复制每个新添加的所有先前附加的数据.如果您处于这种情况,请考虑使用类似于StringBuilder或单个调用string.Concat(重载接受一系列字符串连接)来执行此操作.

其他情况是,例如,处理DNA链的程序.它们通常会捕获数百万个字符串,并创建数十万字符长的字符串.因此,使用标准C#字符串操作会导致大量不必要的复制.编写此类程序的人最终会创建可以表示另一个字符串的子字符串的对象,而无需复制数据,而是使用偏移量引用现有字符串的基础数据源.