【问题标题】:Apply Trim() to string without assignment to variable将 Trim() 应用于字符串而不分配给变量
【发布时间】:2015-08-31 14:45:35
【问题描述】:

是否可以将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"

【问题讨论】:

  • 没有。字符串是不可变的。 StringBuilder 是可变变体。
  • 您只需要在结果中显示修剪后的字符串而不分配给变量吗?
  • 谢谢大家!这似乎是一个愚蠢的问题,但我想知道为什么。

标签: c# trim


【解决方案1】:

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

.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
【解决方案2】:

为了使 cmets 形式化,字符串是不可变的,不能按照您的意愿在线更改。

根据MSDN

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

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

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

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

【讨论】:

    【解决方案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?

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        相关资源
        最近更新 更多