web-dev-qa-db-ja.com

Assert.AreNotEqualとAssert.AreNotSameの違いは何ですか?

C#では、違いは何ですか

Assert.AreNotEqual

そして

Assert.AreNotSame
61
Dan Esparza

ここに記載されているほとんどすべての答えは正しいですが、おそらく例を挙げておく価値があります。

public static string GetSecondWord(string text)
{
    // Yes, an appalling implementation...
    return text.Split(' ')[1];
}

string expected = "world";
string actual = GetSecondWord("hello world");

// Good: the two strings should be *equal* as they have the same contents
Assert.AreEqual(expected, actual);

// Bad: the two string *references* won't be the same
Assert.AreSame(expected, actual);

AreNotEqualAreNotSameは、もちろんAreEqualAreSameの単なる反転です。

編集: 現在受け入れられている答えへの反論 ...

値タイプでAssert.AreSameを使用すると、ボックス化されます。つまり、次のように実行することと同じです。

int firstNumber = 1;
int secondNumber = 1;
object boxedFirstNumber = firstNumber;
object boxedSecondNumber = secondNumber;

// There are overloads for AreEqual for various value types
// (assuming NUnit here)
Assert.AreEqual(firstNumber, secondNumber);

// ... but not for AreSame, as it's not intended for use with value types
Assert.AreSame(boxedFirstNumber, boxedSecondNumber);

firstNumberは値の型であるため、secondNumberintもオブジェクト値を持ちません。 AreSame呼び出しが失敗する理由は、.NETでは、値をボックス化すると毎回新しいボックスが作成されるためです。 (Javaでは、そうでない場合があります-これは以前に私を見つけました。)

基本的に、あなたはnever値の型を比較す​​るときにAreSameを使うべきです。 reference型を比較す​​るときに、同一の参照を確認する場合はAreSameを使用します。 AreEqualを使用して、Equalsの等価性をチェックします。編集:NUnitがEqualsを直接使用しないだけのare状況があることに注意してください。コレクションの組み込みサポートがあり、コレクション内の要素が等しいかどうかがテストされます。

答えの主張:

上記の例を使用してintを文字列に変更すると、AreSameとAreEqualは同じ値を返します。

変数の初期化方法に完全に依存します。彼らが文字列リテラルを使用する場合、それでもインターンがそれを処理します。ただし、以下を使用する場合:

string firstString = 1.ToString();
string secondString = 1.ToString();

次に、AreSameとAreEqualはほぼ確実にnotが同じ値を返します。

はどうかと言うと:

一般的な経験則では、値型にはAreEqualを使用し、参照型にはAreSameを使用します。

私はほぼnever参照IDをチェックしたいと思います。それは私にとってめったに役に立ちません。 equivalenceをチェックしたいのですが、AreEqualがチェックするものです。 (AreSameが存在してはいけないと言っているわけではありません。これは便利な方法であり、AreEqualよりもはるかにまれです。)

82
Jon Skeet

2つのものは等しくても、異なるオブジェクトになる場合があります。 AreNotEqualは等価性テストを介してオブジェクトvaluesをチェックしますが、AreNotSameはそれらが同じオブジェクトではないことをチェックします。

AreNotEqualであることをテストする理由は明らかです(テストされる値に注意します)。 AreNotSameはどうですか?テストでのこの有用性は、参照を渡し、シャッフルが行われた後、2つの参照がまだ同じオブジェクトであることを確認したい場合に見つかります。

実際のケースでは、データベースへの往復を軽減するために、多くのキャッシュオブジェクトを使用します。オブジェクトがキャッシュシステムに渡された後、ユニットテストにより、同じオブジェクトが返される(キャッシュが有効だった)場合と、freshオブジェクト(キャッシュが返された)が返されることを確認します。無効化されました)。この場合、AreNotEqualは必ずしも十分ではないことに注意してください。 dataが等価テストに失敗するほど十分に異なっていないにもかかわらず、データベースにオブジェクトの新しいタイムスタンプがあった場合、AreNotEqualはobjectを更新したことを認識しません。 。

25
Godeke

AreNotSame は参照比較を行いますが、 AreNotEqual は等価比較を行います。

19
ermau

Assert.AreNotEqualは、2つの値が互いに等しくないことをアサートします。

Assert.AreNotSameは、2つの変数が同じオブジェクトを指していないことを表明します。

例1:

 int i = 1; 
 int j = i; 
 //値は等しい:
 Assert.AreEqual(i、j); 
 // 2つの値タイプは同じオブジェクトを表しません* [*] *:
 Assert.AreNotSame(i、j); 

例2:

 string s = "A"; 
 string t = s; 
 //値は等しい:
 Assert.AreEqual(s、t); 
 //参照型は同じオブジェクトを指すことができます* [* _]。
 Assert.AreSame(s、t); 
8
Ole Lynge

AreNotSameは参照の等価性(object.ReferenceEquals)-つまり、オブジェクトの実際のインスタンスは同じですか。 AreNotEqualは、概念的等価(.Equals)-つまり、それらは考慮される等しいか。

7
Marc Gravell

AreNotEqualは、2つのオブジェクトがEquals()メソッドに関して等しくない場合をチェックするのに対し、AreNotSameは、2つのオブジェクト参照が同じでない場合をチェックするのではないですか。したがって、xとyがEquals()に関しては等しいが別々に割り当てられた2つのオブジェクトである場合、AreNotEqual()は失敗したアサーションをトリガーしますが、もう1つはトリガーしません。

3
Antti Huima