[c#] 무한 재귀없이 ‘==’연산자 오버로드에서 null을 어떻게 확인합니까?

다음은 == 연산자 오버로드 메서드에서 무한 재귀를 발생시킵니다.

    Foo foo1 = null;
    Foo foo2 = new Foo();
    Assert.IsFalse(foo1 == foo2);

    public static bool operator ==(Foo foo1, Foo foo2) {
        if (foo1 == null) return foo2 == null;
        return foo1.Equals(foo2);
    }

널은 어떻게 확인합니까?



답변

사용 ReferenceEquals:

Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);

public static bool operator ==(Foo foo1, Foo foo2) {
    if (object.ReferenceEquals(null, foo1))
        return object.ReferenceEquals(null, foo2);
    return foo1.Equals(foo2);
}


답변

오버로드 메서드에서 객체로 캐스트 :

public static bool operator ==(Foo foo1, Foo foo2) {
    if ((object) foo1 == null) return (object) foo2 == null;
    return foo1.Equals(foo2);
}


답변

사용 ReferenceEquals. 로부터 MSDN 포럼 :

public static bool operator ==(Foo foo1, Foo foo2) {
    if (ReferenceEquals(foo1, null)) return ReferenceEquals(foo2, null);
    if (ReferenceEquals(foo2, null)) return false;
    return foo1.field1 == foo2.field2;
}


답변

시험 Object.ReferenceEquals(foo1, null)

어쨌든, 나는 ==연산자를 오버로딩하는 것을 권장하지 않을 것이다 . 참조를 비교하고 Equals“의미 적”비교에 사용해야 합니다.


답변

재정의 bool Equals(object obj)하고 연산자를 원 ==하고 Foo.Equals(object obj)동일한 값을 반환하려면 일반적으로 다음 !=과 같이 연산자를 구현합니다 .

public static bool operator ==(Foo foo1, Foo foo2) {
  return object.Equals(foo1, foo2);
}
public static bool operator !=(Foo foo1, Foo foo2) {
  return !object.Equals(foo1, foo2);
}

운영자 ==는 나를 위해 모든 null 검사를 수행 한 후 foo1.Equals(foo2)두 가지가 동일한 경우 실제 검사를 수행하도록 재정의했다고 호출 합니다.


답변

C # 7 이상을 사용하는 경우 null 상수 패턴 일치를 사용할 수 있습니다.

public static bool operator==(Foo foo1, Foo foo2)
{
    if (foo1 is null)
        return foo2 is null;
    return foo1.Equals(foo2);
}

이것은 하나의 호출 객체보다 약간 깔끔한 코드를 제공합니다.


답변

이 경우 실제로 더 간단한 확인 방법 null이 있습니다.

if (foo is null)

그게 다야!

이 기능은 C # 7에서 도입되었습니다.