2011-08-09 2 views
2

내가뭐죠 Object.Equals의 차이 (널 (null), OBJ) 및 OBJ == null이

if (obj == null) 

최근 나는 것으로 나타났습니다 일반 평등 확인 작업을 사용 null에 개체의 평등을 확인 할 거의 모든 시간을 '더 자주

if (Object.Equals(obj, null)) 

Object.Equals()을 사용하고 있습니다 및 널 (null) 검사에 대해 읽는 동안 나는이 Is ReferenceEquals(null, obj) the same thing as null == obj?

if (ReferenceEquals(null, obj)) 
을 세례반

차이점은 무엇입니까? 그리고 언제/어디에서 각각을 사용합니까? 플러스 나는 마지막 두 검사가 summary

답변

12

Object.Equals(x, y) 뜻에 따라 같은 모양 것을 발견하면 모두 널 (null)

  • 돌아 거짓

    • 반환 사실 x 경우 yx 또는 y 정확히 하나 null입니다
    • 그렇지 않으면 x.Equals(y) 또는 y.Equals(x)을 호출하십시오. - 일 수 없습니다. 즉, 실행 시간 개체 유형 x 또는 y을 참조하여 구현 된 다형성 동작이 호출됩니다.

    ReferenceEquals하지 호 다형성 Equals 방법. 은 평등을 위해 참조를 비교합니다. 예를 들어 :

    string x = new StringBuilder("hello").ToString(); 
    string y = new StringBuilder("hello").ToString(); 
    Console.WriteLine(Object.Equals(x, y)); // True 
    Console.WriteLine(Object.ReferenceEquals(x, y)); // False 
    Console.WriteLine(x == y); // True due to overloading 
    

    이제 있다면 에만는 당신이 정말로하지 은 다형성 (polymorphic)를 원하는, 무효 확인 - 단지 평등을 참조합니다. 그러므로 ReferenceEquals을 자유롭게 사용하십시오.

    당신 사용 ==또한 수 있지만이 될 수 과부하 클래스에 의해 (무시하지) - 위와 같이이 문자열의 경우입니다. == 구현을 호출하지 당신이 정말로

    여기
    public bool operator ==(Foo x1, Foo x2) 
    { 
        if (ReferenceEquals(x1, x2)) 
        { 
         return true; 
        } 
        if (ReferenceEquals(x1, null) || ReferenceEquals(x2, null)) 
        { 
         return false; 
        } 
        return x1.Equals(x2); 
    } 
    

    영원히 재귀 때문에 - 당신이 원하는 : 당신이 ==을 구현있을 때 내 경험에 ReferenceEquals를 사용하는 가장 일반적인 경우입니다 매우 명확한 참조 평등 의미론.

  • +0

    게시물의 내용을 수정하지 않고 표시하는 방법은 어떻게 변경합니까? –

    +1

    @Rune : 게시 후 5 분 이내에 수정하면 표시되지 않습니다. –