C# == 운영자는 무엇을 자세히합니까?
-
03-07-2019 - |
문제
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;
}
사전 정의 된 값 유형의 경우, 동등한 연산자 (==)는 피연산자의 값이 동일하고 그렇지 않으면 참된 경우 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