다음은 == 연산자 오버로드 메서드에서 무한 재귀를 발생시킵니다.
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에서 도입되었습니다.