将 Trim() 应用于字符串而不分配给变量

Apply Trim() to string without assignment to variable

是否可以将 Trim() 应用于字符串而不分配给新变量或现有变量?

var myString = "  my string  ";
myString.Trim();

// myString is now value "my string"

不必将其分配给新变量或自身?

var myString = "  my string  ";
myString = myString.Trim();

// myString is now value "my string"

不,你做不到。最接近的解决方案是:

var myString = "  my string  ".Trim();

不,那是不可能的(在语言的使用范围内)。

.NET 中的String class 是不可变的,这意味着特定的字符串永远不会改变。这允许代码在方法之间传递字符串,而不必复制字符串以防止原始字符串发生变化。


该字符串存储在内存中的某个位置,因此如果您继续挖掘它,您可以更改对象的内容,从而更改字符串的值。然而,这违反了字符串在该语言中的工作规则,您最终可能会更改在您没有预料到的地方使用的字符串。

String literals 是被编译器 intern 的,这意味着即使你在代码中多处写了 " my string ",编译时它也只是一个字符串对象。如果您要更改该字符串,您将在所有使用它的地方更改它。

示例:

string test = "My string";

unsafe {
  // Note: example of what NOT TO DO!
  fixed (char* p = test) {
    *p = 'X';
  }
}

string another = "My string";
Console.WriteLine(another);

输出:

Xy string

为了使注释形式化,字符串是不可变的,不能按照您的意愿进行内联更改。

根据MSDN

The value of the String object is the content of the sequential collection, and that value is immutable (that is, it is read-only).

继续更深入地讨论不变性:

A String object is called immutable (read-only), because its value cannot be modified after it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification.

因此,您不能编写一个方法(即使作为扩展,因为 thisref 不能一起使用)会导致底层字符串被物理修剪并且 return在同一行。您必须分配新值。

直接的答案是,不,一旦你有了一个字符串对象,它就不能再改变了。如果您需要一个缺少这些空格的字符串,您别无选择,只能让 .Net 库 and/or VM 为您分配另一个已被修剪的字符串。

如果您无法接受该分配,则必须进行更深入的研究。您能否修改获取或 assemble 那个字符串的代码,也许改变您的方法,使字符串从一开始就不会获取空格?

根据原始字符串的产生方式,有许多不同的方法可以尝试assemble这样的字符串。

天真的答案是使用 StringBuilder,但是,根据您的限制,这可能不合适。每次调用 StringBuilder.Append() 时,它都会将字符串数据复制到自己的内部缓冲区中;然后,当您最终调用 StringBuilder.ToString() 时,它会从其内部缓冲区执行另一份副本,将其 assemble 发送到 return 给您的最终字符串对象中。

根据具体情况,如果您的字符串部分是字符串对象形式,调用 string.Concat(string[]) 可能会更有效。

...

但是还有其他方法。使用 unsafe/fixed 语句,您可以从头开始初始化您自己的字符串。这正是字符串自身方法的工作原理,例如 string.Joinstring.Trim()。自己这样做是可能的,但需要非常小心地处理字符串,并且在技术上也不符合语言规范。

如果您发现自己走这条路 - 手动初始化您自己的字符串 - 我有一个 post 可以提供一些帮助: