C# 우선 순위는 "AS"및 정확성, 유연성 및 성능을위한 전문적인 방법을 사용하는 것과 동일합니다.
-
19-08-2019 - |
문제
나는 구현하는 가장 좋은 방법에 대해 궁금했다 C#에서 정확하고 유연하며 빠른 속도로, 실질적으로 모든 클래스와 상황에 사용할 수 있습니다.. 성능을 위해서는 특수 평등 (실제 클래스의 객체를 매개 변수로 취 함)이 필요하다고 생각했습니다. 코드 복제를 피하기 위해 일반 평등은 특수 평등을 호출해야합니다. 상속 클래스에서도 널 검사는 한 번만 수행해야합니다.
마침내이 디자인을 생각해 냈습니다.
class MyClass
{
public Int32 SomeValue1 = 1;
public Int32 SomeValue2 = 25;
// Ignoring GetHashCode for simplicity.
public override bool Equals(object obj)
{
return Equals (obj as MyClass);
}
public bool Equals(MyClass obj)
{
if (obj == null) {
return false;
}
if (!SomeValue1.Equals (obj.SomeValue1)) {
return false;
}
if (!SomeValue2.Equals (obj.SomeValue2)) {
return false;
}
return true;
}
}
class MyDerivedClass : MyClass
{
public Int32 YetAnotherValue = 2;
public override bool Equals(object obj)
{
return Equals (obj as MyDerivedClass);
}
public bool Equals(MyDerivedClass obj)
{
if (!base.Equals (obj)) {
return false;
}
if (!YetAnotherValue.Equals (obj.YetAnotherValue)) {
return false;
}
return true;
}
}
중요한 아이디어 :
- "AS"연산자의 사용. 이런 식으로 우리는 일반적인 평등에서 널을 점검 할 필요가 없습니다. 잘못된 클래스 유형은 NULL로 축소되며 특수 평등에서 분류됩니다.
- NULL은 파생 된 클래스의 경우에도 정확히 한 지점에서 점검합니다.
- 속성을 점검하면 명확한 구조가 제공됩니다.
이 개념에 결함이 있습니까, 아니면 조건이 놓쳤습니까?
해결책
다른 유형이 관련 될 때 평등 방법이 반사적이지 않습니다.
MyDerivedClass mdc = new MyDerivedClass();
MyClass mc = new MyClass();
Object omdc = mdc;
Object omc = mc;
// mc.Equals(mdc) - true
// mdc.Equals(mc) - true by calling the right overload
// omc.Equals(omdc) - true
// omdc.Equals(omc) - false, the "as" in MyDerivedClass will result in null
이것을 둘러싼 정상적인 방법은 다음과 같습니다.
if (GetType() != other.GetType())
{
return false;
}
문서를 참조하십시오 Object.equals: "X.equals (y)는 y.equals (x)와 동일한 값을 반환합니다." 다른 결과를 제공하기 위해 과부하에 의존하면 무섭게 디버그에 매우 미묘한 문제.
제휴하지 않습니다 StackOverflow