문제

C#에서 두 객체의 "=="연산자와 비교할 때 백그라운드에서 정확히 어떤 일이 발생합니까? 주소를 비교합니까? 아니면 equals () 또는 compareto ()와 같은 것이 있습니까?

추신 : Java의 "=="연산자는 어떻습니까? 동일하게 행동합니까?

도움이 되었습니까?

해결책

내가 아는 한:

  • 가치 유형을 값으로 비교합니다 (평등)
  • 참조 유형을 참조별 (Identity) 비교합니다.
  • == 운영자가 과부하가 발생한 경우를 제외하고는 그 일을 호출합니다.

Equals는 Object에서 구현되며 재정의 할 수 있습니다. 객체의 기본 구현은 참조 유형에 대한 참조 비교를 수행합니다. 따라서 기본적으로, 동일하게 == 동일하게 수행합니다.

Java에서 == 연산자를 과부하 할 수 없다고 생각합니다. 그러나 나의 Java 지식은 꽤 구식입니다.

편집하다:주목하십시오 == 연산자는 정적 방법입니다. 변수 또는 필드의 유형을 바탕으로 컴파일 시간에 제한됩니다. Equals 실제 런타임 유형을 기반으로 런타임에서 발견되는 가상 메소드입니다.

다른 팁

연장으로 스테판의 훌륭한 대답 - 또 다른 예외는 피연산자가 관련된 경우입니다 Nullable<T> -이 경우 "리프팅 된"연산자가 적용됩니다 (ECMA 334v4에서 14.2.7) :

평등 연산자의 경우 ==! =

피연산자 유형이 널리화되지 않은 값 유형이고 결과 유형이 bool 인 경우 연산자가 들어 올려 진 형태가 존재합니다. 리프트 형태는 단일을 추가하여 구성됩니까? 각 피연산자 유형에 대한 수정 자. 리프트 연산자는 두 개의 널 값을 동일하고 널 값이 아닌 값이 동일하지 않은 것으로 간주합니다. 두 피연산자가 모두 null 인 경우, 리프트 된 연산자는 피연산자를 풀고 기본 연산자를 적용하여 BOOL 결과를 생성합니다.

그 의미는 : (예 :) 사이에 평등 연산자가 있기 때문에 :

int i = ..., j = ...;
bool eq = i == j;

따라서 양식의 암시 적 연산자가 있습니다 (다르게 수행되었지만).

int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
    if(j.HasValue) { // both have values; compare
       eq = i.GetValueOrDefault() == j.GetValueOrDefault();
    } else { // one null; always false
       eq = false;
    }
} else { // true if both null, else false
    eq = !j.HasValue;
}

MSDN에서:

사전 정의 된 값 유형의 경우, 동등한 연산자 (==)는 피연산자의 값이 동일하고 그렇지 않으면 참된 경우 true를 반환합니다. 문자열 이외의 참조 유형의 경우, 두 피연산자가 동일한 객체를 참조하면 ==가 true를 반환합니다. 문자열 유형의 경우 == 문자열 값을 비교합니다.

아니요 ... == 운영자가 항상 Java와 C#에서 동일하게 행동하지는 않습니다.

예를 들어 끈으로; java ==는 문자열 객체의 참조를 비교합니다 ... (primitve 유형을 사용하는 경우, == java는 값을 비교합니다). 그것이 이유입니다

// returns FALSE in JAVA
(new String("test") == "test") 

Java에서 True가 돌아 오지 않을 것입니다 ...

대조적으로 C#에서 == 연산자는 문자열에서 다르게 행동합니다. 예를 들어, 다음 경우에는 true를 반환합니다.

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 

그것이하는 일은 맥락에 달려 있습니다.

http://en.csharp-online.net/ecma-334:_14.9_relational_and_type-testing_operators

== 연산자의 동작은 귀하가 적용하는 변수가 어떻게 선언 된 지에 따라 다릅니다 (객체의 클래스가 아닌 예를 추가하겠습니다).

가치 유형의 경우 값을 비교합니다.

참조 유형의 경우 a == b는 == 연산자가 과부하되지 않는 한 a가 b와 동일한 객체 인 경우 true를 반환합니다. 다른 사람들이 말했듯이, 당신은 가상이 아니기 때문에 C#의 연산자를 무시할 수는 없습니다.

object obj_a, obj_b; string str_a, str_b;

        str_a = "ABC";
        str_b = new string("ABC".ToCharArray());
        obj_a = str_a;
        obj_b = str_b;

        Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
        Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
        Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
        Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
        Console.ReadKey();

그 프로그램의 출력은 다음과 같습니다

str_a == str_b = True
str_a.Equals(str_b) = True
obj_a == obj_b = False
obj_a.Equals(obj_b) = True

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top