2009-04-30 4 views
15

in C# 두 개체에서 "=="연산자를 사용하여 비교할 때 백그라운드에서 정확히 무엇이 발생합니까? 그냥 주소를 비교합니까? 또는 Equals() 또는 CompareTo()와 같은 작업을 수행합니까?C# == 연산자는 무엇을 자세하게합니까?

PS : java의 "=="연산자는 무엇입니까? 그것은 똑같은 행동인가?

+0

입니다 : 당신은 == 과부하 경우, 당신은 또한 구현해야 =!. <= and > =도 마찬가지입니다. – Tarik

답변

24

내가 아는 :

  • 그러므로 (평등)
  • 그것은 참조에 의해 참조 형식 비교 (신원) == 연산자 과부하되는 경우를 제외
  • , 값 치형 비교 그걸 하나 부른다.

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

자바에서는 == 연산자를 오버로드 할 수 없다고 생각합니다. 하지만 Java 지식은 꽤 오래되었습니다.

편집 : == 연산자는 정적 메서드입니다. 변수 나 필드의 유형에 기초하여 컴파일 타임에 바인딩됩니다. Equals은 실제 런타임 유형을 기반으로 런타임에 발견되는 가상 메소드입니다.

+3

우수 답변; 적어도 하나의 누락, 그러나 : http://stackoverflow.com/questions/806020/snip/806068#806068 –

+0

당신은 자바에서 == 연산자를 재정의 할 수 없으며, java의 참조 유형은 == 항상 참조를 수행합니다 (신원) 비교. –

+1

C#의 연산자는 가상이 아니기 때문에 무시할 수 없습니다. 그들을 오버로드 할 수 있습니다. –

4

From MSDN 그렇지 않으면 미리 정의 된 치형

, 피연산자 의 값이 동일한 경우 항등 연산자 (==)가 true를 반환 거짓. 참조 유형이 문자열이 아닌 인 경우 ==는 두 피연산자가 동일한 객체를 참조하면 true를 반환합니다. 문자열 유형의 경우 == 은 문자열 값을 비교합니다.

3

아니요 ... == 연산자가 항상 java 및 C#에서 동일한 동작을하는 것은 아닙니다.

예 : Strings; Java ==는 문자열 객체의 참조를 비교합니다 ... (primitve 유형을 사용하는 경우 Java에서 ==는 값을 비교합니다).

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

자바에서 true를 반환하지 않습니다 그 이유는 대조적으로 C#에서

...입니다, == 연산자는 문자열에 다른 행동 않습니다. 예를 들어, 다음과 같은 경우에 true를 돌려줍니다 :

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

이것은 == 연산자가 Java에서는 오버라이드 될 수 없지만 C#에서는 오버라이드 될 수 없기 때문에 이것이 문자열에 대한 것입니다. 이것은 운영자의 행동을 다르게합니까? –

+0

저는 이것이 C#으로 소프트웨어를 작성하고 다른 프로젝트에서 Java를 사용하는 것이 일반적인 함정이라고 생각합니다. 그래서 그것을 지적하고자했습니다 – Homes2001

9

를 연장으로 Stefan's excellent answer에 - 또 다른 예외는 피연산자가 Nullable<T>을 포함하는 경우 -이 경우 사업자 (14.2 적용 "해제".ECMA의 334v4) 7 : 동등 사업자

== =

피연산자 타입 모두 비 - 널 값 유형 인 경우 및 조작자의 상승 형태 존재 결과 입력하면! bool입니다. 해제 된 양식 은 하나의? 각 피연산자 유형에 대한 수정 자. 해제 된 연산자는 두 개의 null 값을 같고 null이 아닌 값은 null이 아닌 값인 이 아닌 것으로 간주합니다. 피연산자가 모두 null이 아닌 경우 들어 올린 연산자는 피연산자를 랩핑 해제하고 은 기본 연산자를 에 적용하여 부울 결과를 생성합니다. 그 의미

이다 : (다르게 할지라도)

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; 
} 
0
사이 항등 연산자 (말)이 있기 때문에

== 연산자의 동작은 적용 할 변수가 선언 된 방식에 따라 다릅니다 (객체 클래스가 아니라 예제를 추가합니다).

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

참조 유형의 경우 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 

관련 문제