Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在处理字符串中的字符时,不变原则是否仍然适用?_C#_String_Immutability - Fatal编程技术网

C# 在处理字符串中的字符时,不变原则是否仍然适用?

C# 在处理字符串中的字符时,不变原则是否仍然适用?,c#,string,immutability,C#,String,Immutability,如果我操纵字符串的特定字符,CLR是否仍会将其视为内部的字符串操纵,从而导致临时字符串创建 例如: string myString = "String"; myString[0] = 's'; 为正在编辑的字符串创建一个字符数组[]eqvivalent,并对其执行所有特定于位置的操作,然后将其转换回字符串 这是否有助于将临时字符串的数量至少减少到2个实际的字符串操作?此代码不编译: 错误CS0200:属性或索引器 无法分配“string.this[int]” to--它是只读的 这是因为字符串

如果我操纵字符串的特定字符,CLR是否仍会将其视为内部的字符串操纵,从而导致临时字符串创建

例如:

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编译器!是的,一旦我完成了其中一项的开发,您将被告知……:)