예를 들어 다음 코드는
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 참고) type 위의 판단에도 적합합니다. 비어 있지 않은 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(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 중국어 웹사이트를 주목하세요!