C# 在处理字符串中的字符时,不变原则是否仍然适用?
如果我操纵字符串的特定字符,CLR是否仍会将其视为内部的字符串操纵,从而导致临时字符串创建 例如:C# 在处理字符串中的字符时,不变原则是否仍然适用?,c#,string,immutability,C#,String,Immutability,如果我操纵字符串的特定字符,CLR是否仍会将其视为内部的字符串操纵,从而导致临时字符串创建 例如: string myString = "String"; myString[0] = 's'; 为正在编辑的字符串创建一个字符数组[]eqvivalent,并对其执行所有特定于位置的操作,然后将其转换回字符串 这是否有助于将临时字符串的数量至少减少到2个实际的字符串操作?此代码不编译: 错误CS0200:属性或索引器 无法分配“string.this[int]” to--它是只读的 这是因为字符串
string myString = "String";
myString[0] = 's';
为正在编辑的字符串创建一个字符数组[]eqvivalent,并对其执行所有特定于位置的操作,然后将其转换回字符串
这是否有助于将临时字符串的数量至少减少到2个实际的字符串操作?此代码不编译: 错误CS0200:属性或索引器 无法分配“string.this[int]” to--它是只读的 这是因为字符串是不可变的,正如你所说的 为了修改字符串,您需要使用
StringBuilder
类(所有意图和目的都是可变字符串),该类具有读写此[int]
属性
StringBuilder builder = new StringBuilder("Sample");
builder[0] = 's'; //produces "sample"
字符串是不可变的。您不能更改单个字符。字符串上的indexer运算符是只读的,因此,如果尝试对字符串使用数组样式索引进行赋值,则会出现错误。可能值得一提的是,尽管字符串在正常使用中被认为是不可变的,但实际上可以对其进行变异。如果将VS项目配置为“允许使用不安全代码”,则可以使用不安全代码更改字符串:
internal class Program
{
private static void Main()
{
const string SomeString = "hello";
Console.WriteLine("Original string:'{0}'.", SomeString);
unsafe
{
fixed (char* charArray = SomeString)
{
byte* buffer = (byte*)(charArray);
buffer[0] = 66;
buffer[2] = 76;
buffer[4] = 73;
buffer[6] = 78;
buffer[8] = 71;
}
}
Console.WriteLine("Mutated string:'{0}'.", SomeString);
}
}
这可能被认为是相当邪恶的,但它确实有它的用途,例如…Lol,有人买了rockvista编译器!是的,一旦我完成了其中一项的开发,您将被告知……:)