4

サンプルコードがあります。

var charMass = new char[] { 's', 't', 'r' };
string myString = new string(charMass);
string myString2 = new string(charMass);
string myString3 = "str";
string myString4 = "str";

bool bb1 = Object.ReferenceEquals(myString, myString2);
bool bb2 = Object.ReferenceEquals(myString, myString3);
bool bb3 = Object.ReferenceEquals(myString3, myString4);

bb1 と bb2 が false なのはなぜですか? equals は値を比較するため、true を示さなければならないことはわかっていますが、これらの文字列のメモリ割り当てはどうでしょうか。myString3 と myString4 がヒープ内の同じメモリ ブロックを指しているのに、myString と myString2 が指していないのはなぜですか?

4

5 に答える 5

5

C# コンパイラはそれを最適化して、同じリテラルが同じ文字列インスタンスを指すようにします。

MSDN :

インターン プールは、文字列ストレージを節約します。リテラル文字列定数を複数の変数に割り当てる場合、各変数は、同じ値を持つ String の複数の異なるインスタンスを参照するのではなく、インターン プール内の同じ定数を参照するように設定されます。

于 2013-02-21T10:08:31.107 に答える
4

ここであなたの質問に答えます:

http://blogs.msdn.com/b/ericlippert/archive/2009/09/28/string-interning-and-string-empty.aspx .

簡単に言えば、リテラル文字列のインターンは安価で簡単なので、デフォルトで行われます。動的に割り当てられた文字列をインターンすることは、通常、膨大な時間を犠牲にして少数のバイトを節約するため、気にする価値はありません。インターンを強制したい場合は、自分で行うことができます。

于 2013-02-21T15:31:56.530 に答える
1

myStringmyString2文字列コンストラクターを明示的に呼び出し、毎回新しいオブジェクトが作成されるため、相互に (または他の文字列と) 参照が等しくなることはありません。明らかに、この新しいオブジェクトは、他の既存のオブジェクトと同等の参照にはなりません。

myString3とは、コンパイラが文字列をインターンするmyString4ため、参照等価です。コンパイル時に文字列リテラルで初期化された文字列値は、実行時に同じオブジェクトへの参照になります。

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

たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターン プールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。

于 2013-02-21T10:11:58.890 に答える
0

おそらく、コンパイラは"str"を単一のリテラルに最適化し、それを各変数に割り当てます。もちろん、文字列はポインターであり、両方が同じアドレスを指していることを意味します。

于 2013-02-21T10:09:05.913 に答える
0

これは、フレームワーク内の String の基になる実装に基づいています。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

myString と myString2 については、char[] を使用してそれらを作成しましたが、文字列が作成されているため、Intern プールにデフォルトのルックアップがありません。

myString3 と myString4 の場合、myString3 は InternPool に値を追加し、myString4 の場合は、サンプル ブロックであるため参照を取得しただけです。

フレームワークの以前のバージョンでは、 IsIntern はオプションであり、開発者に許可されていたという印象を受けていました。必ずしもそうではないようです

于 2013-02-21T10:13:29.123 に答える