3

与えられた:

        object literal1 = "abc";
        object literal2 = "abc";

        object copiedVariable = string.Copy((string)literal1);

        if (literal1 == literal2)
            Console.WriteLine("objects are equal because of interning");//Are equal

        if(literal1 == copiedVariable)
            Console.WriteLine("copy is equal");
        else
            Console.WriteLine("copy not eq");//NOT equal

これらの結果はcopiedVariable、文字列インターンの対象ではないことを意味します。なんで?

インターンされていない同等の文字列を使用すると便利な状況はありますか、それともこの動作は言語の詳細によるものですか?

4

2 に答える 2

5

考えてみれば、文字列のインターンはコンパイル時にリテラルに対してトリガーされるプロセスです。これは、次のことを意味します。

  • リテラルを変数に割り当て/バインドすると暗黙的になります
  • 参照をコピーするときは暗黙的です(つまり、文字列 a = some_other_string_variable;)

一方、文字列のインスタンスを手動で作成する場合 (実行時に StringBuilder を使用するか、コピーすることにより)、String クラスのInternメソッドを呼び出してインターンを具体的に要求する必要があります。

ドキュメントの備考セクションでも、次のように述べられています。

共通言語ランタイムは、インターン プールと呼ばれるテーブルを維持することで、文字列ストレージを節約します。このテーブルには、プログラムでプログラムによって宣言または作成された一意の各リテラル文字列への単一の参照が含まれています。したがって、特定の値を持つリテラル文字列のインスタンスは、システム内に 1 回だけ存在します。たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターン プールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。

また、String クラスのCopyメソッドのドキュメントには、次のように記載されています。

指定された String と同じ値を持つ Stringの新しいインスタンスを作成します。

これは、(インターン プールから) 同じ文字列への参照を返すだけではないことを意味します。繰り返しますが、もしそうなら、それはあまり役に立たないでしょう?!

于 2013-03-01T15:30:31.810 に答える
1

一部の言語では、結果が特定のメソッド/手順のコピーである必要があります。

たとえば、substring型メソッド。foo.substring(0, foo.length)を呼び出しても(そしておそらくどのように実装するか) 、セマンティクスは同じになりますstringcopy

: IIRC*、ただし、これは .NET の実装には当てはまりませんstring.SubstringMSDNからも明確ではありません。(下記参照)

戻り値:

このインスタンスの startIndex で始まる長さ length の部分文字列に相当する文字列、または startIndex がこのインスタンスの長さと等しく、長さがゼロの場合は Empty です。

それは注意します:

このメソッドは、現在のインスタンスの値を変更しません。代わりに、現在の文字列の startIndex 位置から始まる長さ文字の新しい文字列を返します。

アップデート

私は正しく覚えていますが、確かにstring InternalSubString(int startIndex, int length, bool fAlwaysCopy)if fAlwaysCopyis notでチェックを行いfalseます。このメソッドにSubstring渡します。false

更新 2

前述のパラメーターを使用して渡すstring.Copyこともできたように見えますが、逆アセンブルを見ると、もう少し最適化されたバージョンを使用しているようで、メソッド呼び出しを節約できる可能性があります。InternalSubStringtrue

冗長な情報で申し訳ありません。

*私が覚えている理由はsubstring、R6RS仕様がコピーを作成するために必要とするIronSchemeの手順を実装するときでした:)

于 2013-03-01T15:36:13.273 に答える