2017-07-13 8 views
1

以下は私のテストケースです。両方の文字列は異なるオブジェクトですが、私のテストケースは合格します。文字列参照チェックは、ユニット内でtrueを返します。テスト

私は彼らが失敗することを期待しています。それらは異なるオブジェクトであるためです。

string string1 = "Hello World"; 
    string string4 = "Hello World"; 
    Assert.AreSame(string1, string4);//Will return true 
    Assert.IsTrue(object.ReferenceEquals(string1,string4)); 
+0

使用されているテストフレームワークは何ですか? – Jaya

+1

MSTest Framwork – maxspan

+1

複製/類似:https://stackoverflow.com/questions/9112610/referenceequals-working-wrong-with-strings -tl;時定数をコンパイルする – Jaya

答えて

8

コンパイラは、ハードコードされた同等の文字列に対して1つの "オブジェクト"を作成します。

しかし、あなたは文字列を作成する場合、動的

var string1 = "Hello World"; 
var name = "World"; 
var string2 = "Hello " + name; 
Assert.AreSame(string1, string2); //Will return false 
Assert.IsTrue(object.ReferenceEquals(string1,string2)); // Fail 
Assert.AreEqual(string1, string2); // Pass 

String.Intern Method (String)

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

1

文字列を比較するとき。 objAとobjBが文字列の場合、文字列がインターンされている場合、ReferenceEqualsメソッドはtrueを返します。それは価値の平等のためのテストを実行しません。

次の例では、の単一の保留文字列の2つのインスタンスであるため、s1とs2は等しくなります。 しかし、s3とs4は同じではありません。なぜなら、同じ文字列値を持っていても、その文字列はインターンされていないからです。

String s1 = "String1"; 
String s2 = "String1"; 
//string is interned 

String suffix = "A"; 
String s3 = "String" + suffix; 
String s4 = "String" + suffix; 
//string is not interned 
関連する問題