Programing

C # 두 일반 값 비교

lottogame 2020. 11. 8. 09:09
반응형

C # 두 일반 값 비교


중복 가능성 :
== 연산자를 C #의 제네릭 형식에 적용 할 수 없습니까?

다음과 같이 코딩했습니다.

public bool IsDataChanged()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return (valueInDB != valueFromView);
}

현재이 함수는 " 연산자 '! ='를 'T'및 'T'유형의 피연산자에 적용 할 수 없습니다. "오류와 함께 컴파일되지 않습니다 . 이 기능을 작동 시키려면 어떻게해야합니까?


참조 유형임을 나타 내기 위해 T : 클래스를 추가하지 않는 한 일반 유형 (특별한 경우 foo == null 제외)에 연산자를 사용할 수 없습니다 (그런 다음 foo == bar가 합법적 임).

EqualityComparer<T>.Default를 사용하십시오 . 다음 중 하나없이 ==에 대한 연산자 오버로드 만 제공하는 유형 에서는 작동 하지 않습니다 .

  • 도구 IEquatable<T>
  • object.Equals ()를 재정의합니다.

일반적으로 == 연산자를 구현하고 이들 중 적어도 하나를 수행하지 않는 것은 어쨌든 매우 나쁜 생각이므로 문제가되지 않을 것입니다.

public bool IsDataChanged<T>()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return !EqualityComparer<T>.Default.Equals(value1 , value2);
}

제한하지 않으면 IEquatable<T>EqualityComparer 기본 폴 백이 구현되지 않으면 값 유형과 함께 사용될 때 boxing을 유발할 수 있습니다 IEquatable<T>(사용중인 유형을 제어하는 ​​경우 중요하지 않을 수 있음). 나는 당신이 =를 사용하고 있다고 가정하고 있습니다! 성능을 위해 Generic 유형으로 제한 하면 Object.Equals (object) 경로를 통해 우발적 인 권투를 피할 수 있습니다.


그것은 당신을 위해 일할 것입니다.

public bool test<T>(T test, T test2) where T : class
{
    return (test != test2);
}

이것은 귀하의 질문에 댓글을 단 예에서 간단히 붙여 넣었습니다.


형식은 IComparable 또는 IEquatable 인터페이스 를 구현해야합니다 .

아마도 a! = b를! (a == b)로 다시 작성하거나 CompareTo () 또는 Equals () 메서드를 명시 적으로 호출해야 할 것입니다.


객체에 .Equals () 메서드를 오버로드하고 평가를 다음과 같이 변경할 수 있습니다.

return (!valueInDB.Equals(valueFromView));

valueInDB 및 valueFromView가 객체라고 가정합니다. 예제 변수의 이름은 비교에 사용 된 것과 동일하지 않으므로 가정해야했습니다.

편집 : 3 초 차이가 있습니다! 오버로딩에 대한 참고 사항은 유형 내에서 값을 비교해야하는 경우 Object 클래스의 기본 .Equals ()만으로는 충분하지 않습니다. 복잡한 유형에 대한 메모리 비교 만 수행하기 때문입니다. 개체를 비교할 방법을 오버로드하고 구현을 제공해야합니다.

참고 URL : https://stackoverflow.com/questions/488250/c-sharp-compare-two-generic-values

반응형