in C# 두 개체에서 "=="연산자를 사용하여 비교할 때 백그라운드에서 정확히 무엇이 발생합니까? 그냥 주소를 비교합니까? 또는 Equals() 또는 CompareTo()와 같은 작업을 수행합니까?C# == 연산자는 무엇을 자세하게합니까?
PS : java의 "=="연산자는 무엇입니까? 그것은 똑같은 행동인가?
in C# 두 개체에서 "=="연산자를 사용하여 비교할 때 백그라운드에서 정확히 무엇이 발생합니까? 그냥 주소를 비교합니까? 또는 Equals() 또는 CompareTo()와 같은 작업을 수행합니까?C# == 연산자는 무엇을 자세하게합니까?
PS : java의 "=="연산자는 무엇입니까? 그것은 똑같은 행동인가?
내가 아는 :
같음은 개체에 구현되며 재정의 할 수도 있습니다. Object의 기본 구현은 참조 유형에 대한 참조 비교를 수행합니다. 따라서 기본적으로 같음과 ==는 동일합니다.
자바에서는 == 연산자를 오버로드 할 수 없다고 생각합니다. 하지만 Java 지식은 꽤 오래되었습니다.
편집 : ==
연산자는 정적 메서드입니다. 변수 나 필드의 유형에 기초하여 컴파일 타임에 바인딩됩니다. Equals
은 실제 런타임 유형을 기반으로 런타임에 발견되는 가상 메소드입니다.
우수 답변; 적어도 하나의 누락, 그러나 : http://stackoverflow.com/questions/806020/snip/806068#806068 –
당신은 자바에서 == 연산자를 재정의 할 수 없으며, java의 참조 유형은 == 항상 참조를 수행합니다 (신원) 비교. –
C#의 연산자는 가상이 아니기 때문에 무시할 수 없습니다. 그들을 오버로드 할 수 있습니다. –
From MSDN 그렇지 않으면 미리 정의 된 치형
, 피연산자 의 값이 동일한 경우 항등 연산자 (==)가 true를 반환 거짓. 참조 유형이 문자열이 아닌 인 경우 ==는 두 피연산자가 동일한 객체를 참조하면 true를 반환합니다. 문자열 유형의 경우 == 은 문자열 값을 비교합니다.
아니요 ... == 연산자가 항상 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")
이것은 == 연산자가 Java에서는 오버라이드 될 수 없지만 C#에서는 오버라이드 될 수 없기 때문에 이것이 문자열에 대한 것입니다. 이것은 운영자의 행동을 다르게합니까? –
저는 이것이 C#으로 소프트웨어를 작성하고 다른 프로젝트에서 Java를 사용하는 것이 일반적인 함정이라고 생각합니다. 그래서 그것을 지적하고자했습니다 – Homes2001
를 연장으로 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;
}
== 연산자의 동작은 적용 할 변수가 선언 된 방식에 따라 다릅니다 (객체 클래스가 아니라 예제를 추가합니다).
값 유형의 경우 값 유형을 비교합니다.
참조 유형의 경우 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
입니다 : 당신은 == 과부하 경우, 당신은 또한 구현해야 =!. <= and > =도 마찬가지입니다. – Tarik