1

我编写了一个函数 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);
    }
}
4

1 回答 1

12

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

Console.WriteLine(object.ReferenceEquals(greet, x));

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

从 C# 4 规范,第 2.4.4.5 节:

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

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

于 2012-04-19T14:55:27.070 回答