0

この質問に関して、以下のコードが常に true を返すのはなぜですか? [ c# 言語 ]

String a= "hello";
String b= "hello";
if(a==b)
Console.WriteLine("Is it really reference type?");

ここで、参照型ではなく値型として動作する理由について説明が必要です。これに関する MSDN ドキュメントはありますか、またはこの例外を記憶する必要がありますか、またはこれは完全に論理的ですが、取得できませんか?

詳細な説明ありがとうございます。

4

3 に答える 3

12

どのクラスでも==演算子をオーバーライドして、カスタム比較を提供できます。ドキュメンテーション

それがStringクラスが行うことです-比較に異なる意味を提供するだけです-オブジェクト参照ではなく文字列値をチェックします。

インスタンスが同じ参照を指しているかどうかを本当に確認したい場合は、object.ReferenceEquals(a, b)

文字列に関する限り、この場合、それらは実際には同一の参照です。コンパイラは、文字列値がまったく同じであることを検出し、メモリに一度だけ格納します。これについて読むべきものがありますString.Intern

于 2013-05-16T10:41:30.543 に答える
2

.NET では、文字列の扱いが少し異なります。それらは参照型ですが、値型として機能するようです。

これの基本的な理由は、文字列が不変で一意であるためです。これが意味することは、文字列 a を定義すると、値「hello」がヒープに保存されるということです。

文字列 b を定義して値 "hello" を割り当てると、同じ文字列へのポインターを作成するときに、ヒープにその値を持つ文字列が既に存在することがわかります。文字列は不変であり、CLR はその文字列が決して変更されないことを認識しているため、これを安全に行うことができます。文字列を変更する操作はすべて、新しい文字列がヒープに割り当てられるだけです。

于 2013-05-16T10:44:36.877 に答える
2

文字列の演算子は、参照型==であっても、参照の等価性ではなく値の等価性をチェックするためにオーバーロードされています。StringMicrosoft は、値のセマンティクスを持つ参照型に対してこれを行うことをお勧めします。

ただし、複素数型など、値のセマンティクスを持つことを目的とした参照型を実装している場合は、等値演算子をオーバーライドする必要があります。

詳細については、 Object.Equals メソッド (オブジェクト)を参照してください。

于 2013-05-16T10:45:23.343 に答える