1

安全でないコンテキストでポインターを使用して、.net の文字列を逆にする関数 Reverse を作成しました。私はこれが好きです。

「gree」と「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));

宣言の直後に、文字列オブジェクトが1つしかないことがわかります。両方の変数が同じオブジェクトを参照しているため、一方の変数を介してオブジェクトに変更を加えた場合、後でもう一方の変数を介してオブジェクトにアクセスしたときに、同じ変更が表示されます。

C#4仕様のセクション2.4.4.5から:

各文字列リテラルは、必ずしも新しい文字列インスタンスになるとは限りません。文字列等価演算子に従って同等の2つ以上の文字列リテラルが同じプログラムに表示される場合、これらの文字列リテラルは同じ文字列インスタンスを参照します。

ああ、実際のコードでは、安全でない操作を使用して文字列を実際に変更していないことを願っています...

于 2012-04-19T14:55:27.070 に答える