C# 将Trim()应用于字符串,而不对变量赋值

C# 将Trim()应用于字符串,而不对变量赋值,c#,trim,C#,Trim,是否可以对字符串应用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" 不,你不能这样做。最接近的

是否可以对字符串应用
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
类是不可变的,这意味着特定的字符串永远不会更改。这允许代码在方法之间传递字符串,而无需复制字符串以防止原始字符串发生更改


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

字符串文本由编译器进行内联,这意味着即使您在代码中的多个位置编写了
“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

为了使注释形式化,字符串是不可变的,不能像您希望的那样在线更改

根据:

String对象的值是序列集合的内容,该值是不可变的(即,它是只读的)

接下来将更深入地讨论不变性:

字符串对象称为不可变(只读),因为它的值在创建后无法修改。看似修改字符串对象的方法实际上返回一个包含修改的新字符串对象


因此,您不能编写一个方法(即使作为扩展,因为
this
ref
不能一起使用),该方法将导致底层字符串被物理修剪并返回到同一行中。您必须分配新值。

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

如果这一分配对你来说是不可接受的,你必须更深入地研究。您能否修改获取或组装该字符串的代码,或者改变您的方法,使该字符串从一开始就不会获取空格

根据原始字符串是如何产生的,有许多不同的方法来尝试组装这样的字符串

简单的答案是使用
StringBuilder
,但是,根据您的约束条件,这可能并不合适。每次调用
StringBuilder.Append()
,它都会将字符串数据复制到自己的内部缓冲区中;然后,当您最终调用
StringBuilder.ToString()
时,它将执行另一个从其内部缓冲区复制到最终字符串对象的操作,并将其组装返回给您

根据具体情况,如果字符串部分以字符串对象的形式存在,那么对
string.Concat(string[])
的调用可能是有效的

然而,还有其他方法。使用不安全/固定语句,您可以从头开始初始化自己的字符串。这正是string自己的方法的工作方式,比如
string.Join
string.Trim()
。自己做这件事是可能的,但需要非常小心地处理字符串,而且在技术上也违反了语言规范

如果您发现自己走上了这条道路——手动初始化自己的字符串——我有一篇文章可以提供一些帮助:


否。字符串是不可变的
StringBuilder
是可变变量。您需要在结果中只显示修剪过的字符串而不指定变量?谢谢大家!这似乎是一个愚蠢的问题,但我想知道为什么。在不安全示例+1上学到了一些新东西