将 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.
因此,您不能编写一个方法(即使作为扩展,因为 this
和 ref
不能一起使用)会导致底层字符串被物理修剪并且 return在同一行。您必须分配新值。
直接的答案是,不,一旦你有了一个字符串对象,它就不能再改变了。如果您需要一个缺少这些空格的字符串,您别无选择,只能让 .Net 库 and/or VM 为您分配另一个已被修剪的字符串。
如果您无法接受该分配,则必须进行更深入的研究。您能否修改获取或 assemble 那个字符串的代码,也许改变您的方法,使字符串从一开始就不会获取空格?
根据原始字符串的产生方式,有许多不同的方法可以尝试assemble这样的字符串。
天真的答案是使用 StringBuilder
,但是,根据您的限制,这可能不合适。每次调用 StringBuilder.Append()
时,它都会将字符串数据复制到自己的内部缓冲区中;然后,当您最终调用 StringBuilder.ToString()
时,它会从其内部缓冲区执行另一份副本,将其 assemble 发送到 return 给您的最终字符串对象中。
根据具体情况,如果您的字符串部分是字符串对象形式,调用 string.Concat(string[])
可能会更有效。
...
但是还有其他方法。使用 unsafe/fixed 语句,您可以从头开始初始化您自己的字符串。这正是字符串自身方法的工作原理,例如 string.Join
或 string.Trim()
。自己这样做是可能的,但需要非常小心地处理字符串,并且在技术上也不符合语言规范。
如果您发现自己走这条路 - 手动初始化您自己的字符串 - 我有一个 post 可以提供一些帮助:
是否可以将 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.
因此,您不能编写一个方法(即使作为扩展,因为 this
和 ref
不能一起使用)会导致底层字符串被物理修剪并且 return在同一行。您必须分配新值。
直接的答案是,不,一旦你有了一个字符串对象,它就不能再改变了。如果您需要一个缺少这些空格的字符串,您别无选择,只能让 .Net 库 and/or VM 为您分配另一个已被修剪的字符串。
如果您无法接受该分配,则必须进行更深入的研究。您能否修改获取或 assemble 那个字符串的代码,也许改变您的方法,使字符串从一开始就不会获取空格?
根据原始字符串的产生方式,有许多不同的方法可以尝试assemble这样的字符串。
天真的答案是使用 StringBuilder
,但是,根据您的限制,这可能不合适。每次调用 StringBuilder.Append()
时,它都会将字符串数据复制到自己的内部缓冲区中;然后,当您最终调用 StringBuilder.ToString()
时,它会从其内部缓冲区执行另一份副本,将其 assemble 发送到 return 给您的最终字符串对象中。
根据具体情况,如果您的字符串部分是字符串对象形式,调用 string.Concat(string[])
可能会更有效。
...
但是还有其他方法。使用 unsafe/fixed 语句,您可以从头开始初始化您自己的字符串。这正是字符串自身方法的工作原理,例如 string.Join
或 string.Trim()
。自己这样做是可能的,但需要非常小心地处理字符串,并且在技术上也不符合语言规范。
如果您发现自己走这条路 - 手动初始化您自己的字符串 - 我有一个 post 可以提供一些帮助: