programing tip

== 또는 .Equals ()

itbloger 2020. 12. 8. 07:47
반응형

== 또는 .Equals ()


왜 다른 하나를 사용합니까?


==는 신원 테스트입니다. 테스트중인 두 개체가 실제로 동일한 개체이면 true를 반환합니다. Equals()동등성 테스트를 수행하고 두 개체가 동일하다고 생각하면 true를 반환합니다.

신원 테스트는 더 빠르므로 더 비싼 동등성 테스트가 필요하지 않을 때 사용할 수 있습니다. 예를 들어, 비교 null또는 빈 문자열입니다.

ID 테스트와 같은 다른 동작을 제공하기 위해 이들 중 하나를 오버로드 할 수 Equals()있지만 코드를 읽는 사람을 위해하지 마십시오.


아래에 지적 : 등가 의미론을 제공 하는 연산자에 대한 오버로드 와 같 String거나 DateTime제공하는 일부 유형 ==. 따라서 정확한 동작은 비교하는 개체의 유형에 따라 다릅니다.


또한보십시오:


@John Millikin :

아래에 설명되어 있습니다. DateTime과 같은 일부 값 유형은 같음 의미를 제공하는 == 연산자에 대한 오버로드를 제공합니다. 따라서 정확한 동작은 비교중인> 객체의 유형에 따라 달라집니다.

자세히 설명하려면 :

DateTime은 구조체로 구현됩니다. 모든 구조체는 System.ValueType의 자식입니다.

System.ValueType의 자식은 스택에 있으므로 힙에 대한 참조 포인터가 없으므로 참조 검사를 수행 할 방법이 없으므로 개체를 값으로 만 비교해야합니다.

System.ValueType은 .Equals () 및 ==를 재정 의하여 리플렉션 기반 같음 검사를 사용하고 리플렉션을 사용하여 각 필드 값을 비교합니다.

리플렉션이 다소 느리기 때문에 자체 구조체를 구현하는 경우 .Equals ()를 재정의하고 자체 값 검사 코드를 추가하는 것이 훨씬 빠르기 때문에 중요합니다. base.Equals (); 호출하지 마세요.


다른 모든 사람들이 당신을 거의 다뤘지만 조언 한 마디가 더 있습니다. 때때로, 당신은 자신의 삶 (그리고 그의 사랑하는 사람들의 삶)에 대해 .Equals더 효율적이고 / 더 나은 / 모범 사례 또는 다른 독단적 인 선 을 맹세하는 사람을 얻게 될 것 입니다. 효율성에 대해 말할 수는 없지만 (글쎄요, 특정 상황에서는 가능합니다) 큰 문제에 대해 말할 수 .Equals있습니다. 개체가 존재해야합니다. (어리석은 것 같지만 사람들을 쫓아냅니다.)

다음을 수행 할 수 없습니다.

StringBuilder sb = null;
if (sb.Equals(null))
{
    // whatever
}

나에게, 그리고 아마도 대부분의 사람들에게 당신이 NullReferenceException. 그러나 지지자들은 .Equals그 작은 사실 잊어 버립니다. 일부는 NullRefs가 팝업되기 시작하는 것을 볼 때 (미안합니다. 저항 할 수 없었습니다) "던져졌습니다".

( DailyWTF가 게시 되기 몇 년 전에 저는 실제로 모든 평등 검사가. 대신 하도록 명령 한 사람과 함께 작업했습니다 . 그의 부정확성을 증명하는 것도 도움이되지 않았습니다. 우리는 그의 다른 모든 규칙을 위반하여 참조가 반환되지 않도록했습니다. 메서드도 속성도 null이 아니었고 결국 해결되었습니다.).Equals==


==는 일반적으로 "아이덴티티"는 "객체 a는 실제로 메모리에서 객체 b와 똑같은 객체"를 의미합니다.

equals ()는 객체가 논리적으로 동일 함을 의미합니다 (예 : 비즈니스 관점에서). 따라서 사용자 정의 클래스의 인스턴스를 비교하는 경우 Hashtable과 같은 항목이 제대로 작동하려면 일반적으로 equals ()를 사용하고 정의해야합니다.

속성이 "Name"및 "Address"인 속담 Person 클래스가 있고이 Person을 더 많은 정보가 포함 된 Hashtable의 키로 사용하려면 equals () (및 해시)를 구현해야합니다. Person의 인스턴스를 생성하고 정보를 얻기 위해 Hashtable의 키로 사용할 수 있습니다.

== 만 사용하면 새 인스턴스가 동일 하지 않습니다 .


MSDN 에 따르면 :

C #에는 참조 같음 (ID라고도 함)과 값 같음의 두 가지 종류가 있습니다. 가치 평등은 일반적으로 이해되는 평등의 의미입니다. 두 개체가 동일한 값을 포함한다는 의미입니다. 예를 들어, 값이 2 인 두 정수는 값이 동일합니다. 참조 동등성은 비교할 두 개체가 없음을 의미합니다. 대신 두 개의 개체 참조가 있으며 둘 다 동일한 개체를 참조합니다.

...

기본적으로 == 연산자는 두 참조가 동일한 객체를 나타내는 지 확인하여 참조 동등성을 테스트합니다.


Equals둘 다 ==오버로드 될 수 있으므로 중 하나를 호출하는 정확한 결과는 다양합니다. ==실제 구현 변경할 수 있도록하면서, 컴파일 시간에 결정되고, ==달리 컴파일시에 고정되어 사용 Equals되는 좌측 런타임 유형에 따라 서로 다른 구현을 사용할 수있다.

예를 들어에 string대한 동등성 테스트를 수행합니다 ==.

또한 두 가지 의미 모두 복잡 할 수 있습니다 .

모범 사례는이 예제와 같은 동등성을 구현하는 것입니다. 클래스 사용 계획에 따라이 모든 것을 단순화하거나 제외 할 수 있으며 struct이미 대부분을 얻었습니다.

class ClassName
{
    public bool Equals(ClassName other)
    {
        if (other == null)
        {
            return false;
        }
        else
        {
            //Do your equality test here.
        }
    }

    public override bool Equals(object obj)
    {
        ClassName other = obj as null; //Null and non-ClassName objects will both become null
        if (obj == null)
        {
            return false;
        }
        else
        {
            return Equals(other);
        }
    }

    public bool operator ==(ClassName left, ClassName right)
    {
        if (left == null)
        {
            return right == null;
        }
        else
        {
            return left.Equals(right);
        }
    }

    public bool operator !=(ClassName left, ClassName right)
    {
        if (left == null)
        {
            return right != null;
        }
        else
        {
            return !left.Equals(right);
        }
    }

    public override int GetHashCode()
    {
        //Return something useful here, typically all members shifted or XORed together works
    }
}

The example is because the class DateTime implements the IEquatable interface, which implements a "type-specific method for determining equality of instances." according to MSDN.


Another thing to take into consideration: the == operator may not be callable or may have different meaning if you access the object from another language. Usually, it's better to have an alternative that can be called by name.


use equals if you want to express the contents of the objects compared should be equal. use == for primitive values or if you want to check that the objects being compared is one and the same object. For objects == checks whether the address pointer of the objects is the same.


I have seen Object.ReferenceEquals() used in cases where one wants to know if two references refer to the same object


In most cases, they are the same, so you should use == for clarity. According to the Microsoft Framework Design Guidelines:

"DO ensure that Object.Equals and the equality operators have exactly the same semantics and similar performance characteristics." https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/equality-operators

But sometimes, someone will override Object.Equals without providing equality operators. In that case, you should use Equals to test for value equality, and Object.ReferenceEquals to test for reference equality.


If you do disassemble (by dotPeek for example) of Object, so

public virtual bool Equals(Object obj)

described as:

// Returns a boolean indicating if the passed in object obj is
// Equal to this.  Equality is defined as object equality for reference
// types and bitwise equality for value types using a loader trick to
// replace Equals with EqualsValue for value types). 
//

So, is depend on type. For example:

        Object o1 = "vvv";
        Object o2 = "vvv";
        bool b = o1.Equals(o2);

        o1 = 555;
        o2 = 555;
        b = o1.Equals(o2);

        o1 = new List<int> { 1, 2, 3 };
        o2 = new List<int> { 1, 2, 3 };
        b = o1.Equals(o2);

First time b is true (equal performed on value types), second time b is true (equal performed on value types), third time b is false (equal performed on reference types).

참고URL : https://stackoverflow.com/questions/144530/or-equals

반응형