>  기사  >  백엔드 개발  >  C#에서 ==와 equals()의 차이점

C#에서 ==와 equals()의 차이점

高洛峰
高洛峰원래의
2016-12-16 09:47:591408검색

다음 코드와 같습니다:

int age = 25;
 
short newAge = 25;
 
Console.WriteLine(age == newAge);  //true
 
Console.WriteLine(newAge.Equals(age)); //false
 
Console.ReadLine();

int와 short는 기본 유형이지만 "=="와 비교하면 true를 반환하고, equals()에서는 false를 반환합니다. 왜?

답변:

요약:

"equals()"는 "=="보다 더 복잡합니다.

구체적으로:
기본 유형은 기본 클래스의 object.Equals(object)를 재정의하고 괄호 안의 객체가 해당 유형 및 값과 동일한 경우 true를 반환합니다(Nullable 유형도 위의 유형에 적합함) 비어 있지 않은 Nullable 유형은 항상 기본 유형의 인스턴스로 묶입니다.

newAge가 짧으므로 newAge.Equals(object)는 object가 짧고 값이 newAge 값과 같을 때 true를 반환합니다. 전달하는 것은 int 객체이므로 false를 반환합니다.

반대로 "==" 연산자는 두 개의 정수(int), 두 개의 짧은 정수(short) 또는 두 개의 긴 정수(long)를 사용하는 연산으로 정의됩니다. "=="의 두 매개변수가 정수와 짧은 정수인 경우 컴파일러는 암시적으로 short를 int로 변환하고 변환된 int 값의 크기를 비교합니다.

작동시키는 다른 방법:

기본 유형에도 고유한 equals() 메소드가 있으며, equals는 동일한 유형의 매개변수를 허용합니다.

age.Equals(newAge)를 작성하면 컴파일러는 int.Equals(int)를 최상의 오버로드 방법으로 선택하고 암시적으로 short를 int로 변환합니다. 그런 다음 이 메서드는 두 int 값의 크기를 직접 비교하기 때문에 true를 반환합니다.

short에도 short.Equals(short) 메서드가 있지만 int 형식은 암시적으로 short로 변환할 수 없으므로 호출되지 않습니다.

캐스트 변환을 사용하여 이 메소드를 강제로 호출할 수 있습니다.

Console.Writeline(newAge.Equals((short)age)); //true

이것은 박싱 작업 없이 short.Equals(short)를 직접 호출합니다. age가 32767보다 크면 오버플로 예외가 발생합니다.

short.Equals(object) 오버로드를 호출할 수도 있지만 동일한 유형의 boxed 객체를 명시적으로 전달해야 합니다.

Console.WriteLine(newAge.Equals((object)(short)age)); // true

이전 선택적 메서드(short.Equals)와 같습니다. Equals(short)), 크기가 짧은 범위를 초과하면 오버플로 예외도 발생합니다. 이전 솔루션과 달리 개체가 부족하여 시간과 메모리가 낭비됩니다.

소스 코드:

실제로 사용되는 Equals()는 다음과 같습니다.

 public override bool Equals(Object obj) {
 
        if (!(obj is Int16)) {
 
            return false;
 
        }
 
        return m_value == ((Int16)obj).m_value;
 
    }
 
    public bool Equals(Int16 obj)
 
    {
 
        return m_value == obj;
 
    }




C#에서 ==와 equals()의 차이점에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.