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

时间:2012-04-19 14:53:33

标签: .net string pointers unsafe

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

我分配“greet”和“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);
    }
}

1 个答案:

答案 0 :(得分:12)

没什么奇怪的。您正在查看实习。如果你写:

Console.WriteLine(object.ReferenceEquals(greet, x));
声明后,您会立即看到您只有一个字符串对象。两个变量都引用同一个对象,所以很明显,如果你通过一个变量对对象进行修改,那么当你稍后通过另一个变量访问它时,你会看到相同的变化。

从C#4规范,第2.4.4.5节:

  

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

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