是.net中的字符串得到改变?有一些错误吗?

Pri*_*esh 1 .net string pointers unsafe

我已经编写了一个函数Reverse来使用不安全上下文中的指针反转.net中的字符串.我喜欢这个.

我分配"问候"和"x"相同的值.我反向问候我的意外x也被逆转了.

using System;

class Test{

    private unsafe static void Reverse(string text){
        fixed(char* pStr = text){
            char* pBegin = pStr;
            char* pEnd = pStr + text.Length - 1;
            while(pBegin < pEnd){
                char t = *pBegin;
                *pBegin++ = *pEnd;
                *pEnd-- = t; 
            }
        }
    }

    public static void Main(){
        string greet = "Hello World";
        string x = "Hello World";
        Reverse(greet);
        Console.WriteLine(greet);
        Console.WriteLine(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

没什么奇怪的.你看到了实习生.如果你写:

Console.WriteLine(object.ReferenceEquals(greet, x));
Run Code Online (Sandbox Code Playgroud)

声明后,你会看到你只有一个字符串对象.两个变量都引用同一个对象,因此很明显,如果通过一个变量对对象进行修改,则稍后通过另一个变量访问它时会看到相同的更改.

从C#4规范,第2.4.4.5节:

每个字符串文字不一定会产生新的字符串实例.当两个或多个根据字符串相等运算符等效的字符串文字出现在同一程序中时,这些字符串文字引用相同的字符串实例.

哦,我希望在实际代码中你实际上并没有使用不安全的操作来修改字符串......

  • @Pritesh:不,我已经证明它是指定的行为."故障"是指修改字符串对象,通常认为它们是不可变的. (6认同)
  • @Pritesh:不,你没有.您声明了两个变量,并为两者使用了相同的字符串文字,这意味着您有两个变量,它们都引用相同的字符串对象. (3认同)