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

时间:2015-08-31 14:45:35

标签: 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"

4 个答案:

答案 0 :(得分:6)

不,这是不可能的(使用语言)。

.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

答案 1 :(得分:4)

为了使评论形式化,字符串是不可变的,不能像你想要的那样在线改变。

根据MSDN

  

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

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

  

String对象称为immutable(只读),因为在创建后无法修改其值。看似修改String对象的方法实际上返回一个包含修改的新String对象。

因此,您不能编写一个方法(即使作为扩展名,因为thisref不能一起使用),这会导致基础字符串被物理修剪并返回到同一行。您必须分配新值。

答案 2 :(得分:3)

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

如果您无法接受此分配,则必须深入了解。你能修改获取或组装该字符串的代码,并且可能改变你的方法,以便字符串永远不会获得空格吗?

根据原始字符串的存在方式,有许多不同的方法可以尝试组合这样的字符串。

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

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

...

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

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

Is it possible to concatenate a list of strings using only a single allocation?

答案 3 :(得分:0)

不,你不能这样做。最接近的解决方案是:

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