2017-03-21 17 views
0

私はいくつかのコードレビューをしています。これは、ReferenceEqualsを使用して、引数または新しいものとして渡されたメソッドが実際に返されたメソッドかどうかをチェックする正しい方法ですか?ReferenceEqualsを正しく使用するこの方法です

int x = 5; 
Foo f = new Foo() 

Foo DoSomething(Foo f) 
{ 
    if(x > 5) 
    { 
     return f; 
    } 
    else 
    { 
     return new Foo(); 
    } 
} 

Foo ff = DoSomething(f); 

if(Object.ReferenceEquals(ff, f)) 
{ 
    //do something 
} 
+0

'foo'が' == 'をオーバーライドしないと仮定すると、デフォルトで' Object.ReferenceEquals'に 'ff == f'を使うこともできます。オペレータをオーバーライドする場合は、正しいかどうかを決定するのはあなた次第です。 – Rob

答えて

1

はい、参考タイプです。値の型は、メソッドに渡す前にボックス化されているため、複雑です。

値の型を比較す​​る場合。 objAとobjBが値型である場合、それらはReferenceEqualsメソッドに渡される前に に囲まれています。これはOBJAとobjB両方が値 タイプの同一のインスタンスを表す場合、も参照メソッドは、それにもかかわらずfalseを返すこと 意味し、

は詳細here

Reference equality of value types

0

ReferenceEquals Method - MSDN

を読みます

Equalsメソッドと等価演算子とは異なり、ReferenceEqualsメソッドはオーバーライドされます。このため、2つのオブジェクト参照を等価でテストし、Equalsメソッドの実装が不明な場合は、ReferenceEqualsメソッドを呼び出すことができます。ただし、objAおよびobjBが値型である場合、それらはReferenceEqualsメソッドに渡される前にボックス化されています。

関連する問題