==와 같음 ()의 C # 차이


548

Silverlight 응용 프로그램에서 2 개의 문자열을 비교하는 조건이 있습니다. 어떤 이유로 사용 ==하면 true.Equals()반환하고 false 를 반환 합니다 .

코드는 다음과 같습니다.

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
    // Execute code
}

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
    // Execute code
}

왜 이런 일이 발생하는지에 대한 이유가 있습니까?



8
문자열은 재정의 ==되지만 연산자는 다형성이 아닙니다. 이 코드에서 ==연산자는 type object에 대해 호출되며 값 1 대신 ID 비교를 수행합니다.
Drew Noakes

12
@DrewNoakes '주석 확장 : 컴파일러 ==는 피연산자의 컴파일 타임 유형에 따라 오버로드를 선택합니다 . Content호텔입니다 object. 연산자는 가상이 아니므로 기본 구현을 ==호출하여 참조 동등성을 비교합니다. Equals를 사용하면 호출이 가상 메소드로 이동합니다 object.Equals(object). string이 메서드를 재정의하고 문자열 내용에 대한 서수 비교를 수행합니다. msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspxreferencesource.microsoft.com/#mscorlib/system/string.cs,507을 참조 하십시오 .
phoog

6
@phoog의 설명은 정확합니다. 의 왼쪽에 ==컴파일 타임 유형이 object있고 오른쪽에 컴파일 타임 유형 이 있으면 stringC # 컴파일러는 (이 경우 문제가되는) 오버로드를 선택해야합니다 operator ==(object, object). 하지만 것입니다 그것을 의도하지 않은 될 수 있다는 컴파일시 경고를 실행합니다. 그래서 읽기 컴파일시 경고! 문제를 해결하고 계속 사용 ==하려면 왼쪽을로 캐스팅하세요 string. 내가 올바르게 기억한다면 경고 문구가 그 사실을 암시합니다.
Jeppe Stig Nielsen

1
컴파일러 경고를 읽으려면 @JeppeStigNielsen +1을 참조하십시오. 더 나은 방법 : 모든 사람이주의를 기울 이도록 경고로 경고 옵션을 설정하십시오.
phoog

답변:


429

==유형의 표현에 사용되는 object, 그것은에 해결할 수 있습니다 System.Object.ReferenceEquals.

Equalsvirtual메소드 일 뿐이며 이와 같이 동작하므로 재정의 된 버전이 사용됩니다 ( string유형은 내용을 비교합니다).


56
운영자가 클래스에서 구체적으로 구현되지 않는 한
Dominic Cronin

23
@DominicCronin 사실이 아닙니다. ==가 클래스에서 구현 되더라도 비교 왼쪽의 유형이 객체이므로 무시됩니다. 연산자 오버로드는 컴파일 타임에 결정되고 컴파일 타임에는 왼쪽이 객체임을 알 수 있습니다.
MikeKulls

4
@DominicCronin ==는 객체로 해석되지만 연산자 오버로드가 비슷한 방식으로 해결한다는 두 번째 문장은 정확하지 않다고 생각합니다. 그것들은 상당히 다르기 때문에 .Equals는 문자열로, ==는 객체로 해석됩니다.
MikeKulls

8
명확하게 object말하면 , 타입 (모노 스페이스 폰트에 주목)은 기술적으로 "타입의 표현"을 의미합니다 System.Object. 표현식이 참조하는 인스턴스의 런타임 유형과 관련이 없습니다. "사용자 정의 연산자는 virtual메서드 처럼 취급됩니다"라는 문구 는 매우 잘못된 것 같습니다. 오버로드 된 메소드처럼 취급되며 피연산자의 컴파일 타임 유형에만 의존합니다. 실제로, 후보 사용자 정의 연산자 세트가 계산 된 후, 나머지 바인딩 절차는 정확히 메소드 과부하 해결 알고리즘 일 것입니다
Mehrdad Afshari

4
@DominicCronin 오해의 소지가있는 부분은 virtual메소드 해석이 인스턴스의 실제 런타임 유형에 따라 달라지는 반면, 연산자 오버로드 해석에서는 완전히 무시되며 실제로 내 대답의 요점입니다.
Mehrdad Afshari

314

객체 참조를 문자열과 비교할 때 (객체 참조가 문자열을 참조하더라도), ==문자열 클래스에 특정한 연산자 의 특수 동작 은 무시됩니다.

(인 스트링을 처리하지 않는) 통상은, Equals비교 값을 동시에 ==비교 객체 참조 . 비교하는 두 객체가 동일한 객체의 동일한 인스턴스를 참조하는 경우 둘 다 true를 반환하지만, 하나의 내용이 동일하고 다른 소스에서 온 경우 (데이터가 동일한 별도의 인스턴스 임) Equals 만 true를 돌려줍니다. 그러나 주석에서 언급 한 것처럼 문자열은 ==문자열 참조 ( 문자 참조가 아닌 객체 참조) 만 처리 할 때 별도의 인스턴스 인 경우에도 값만 비교되도록 연산자를 재정의하기 때문에 특별한 경우 입니다. 다음 코드는 동작의 미묘한 차이점을 보여줍니다.

string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));

출력은 다음과 같습니다.

True True True
False True True
False False True

8
에 딱 맞다. '=='연산자는 객체 참조를 비교하고 (얕은 비교) .Equals ()는 객체 내용을 비교합니다 (심도 비교). @mehrdad가 말했듯이 .Equals ()는 해당 내용 비교를 제공하기 위해 재정의됩니다.
Andrew

1
나는 당신이 그것을 깨닫기 위해 세심한주의를 기울여야하기 때문에 일어나지 않는 것을 강조하는 것이 가치 있다고 생각하기 때문에 여기에 게시물을 남길 것입니다. (그리고 나는 코드가 너무 가치가 정확하고 잘못된 이해를 보여 생각합니다.) 내가 평가가 0 이하로하지 않습니다 희망
BlueMonkMN

5
분명히 String은 custom == 연산자를 구현합니다. 그렇지 않은 경우 ==를 사용하면 내용을 비교하지 않습니다. 따라서 사용자 정의 연산자가 정의되지 않은 일반적인 경우를 이해하는 데 도움이되지 않으므로 String은 여기서 사용하기에 나쁜 예입니다.
Dominic Cronin

6
서사적 인 코드 예제의 경우 +1로 이것을 이해했습니다. 정적 타입 (Left Hand Side type)의 일반적인 경우와 정적 타입 (/ RHS 타입)이 문자열 인 경우를 나타냅니다. 그리고 문자열 인턴을 잘 다룹니다.
barlop

2
@badsamaritan 문자열 인턴 때문에
Alexander Derck

46

==그리고 .Equals호출 사이트에서의 실제 유형과 실제 유형에 정의 된 동작에 의존합니다. 둘 다 메소드 / 연산자 일뿐이며 모든 유형에서 재정의되고 작성자가 원하는 동작을 제공 할 수 있습니다. 내 경험상 사람들이 .Equals객체 에 구현 하는 것이 일반적 이지만 operator 구현은 무시하는 것이 일반적입니다 ==. 즉, .Equals실제로 값의 동등성을 ==측정하는 동시에 동일한 참조인지 여부를 측정합니다.

정의가 유동적이거나 일반 알고리즘을 작성하는 새로운 유형으로 작업 할 때 가장 좋은 방법은 다음과 같습니다.

  • C #에서 참조를 비교하려면 Object.ReferenceEquals직접 사용 하십시오 (일반적인 경우에는 필요하지 않음)
  • 내가 사용하는 값을 비교하려면 EqualityComparer<T>.Default

경우에 따라 사용법 ==이 모호 하다고 생각 되면 명확하게 Object.Reference코드에서 equals를 사용 하여 모호성을 제거합니다.

에릭 리퍼 트 ​​(Eric Lippert)는 최근 CLR에 두 가지 평등 방법이있는 이유에 대한 블로그 게시물을 작성했습니다. 읽을 가치가 있습니다


자레드, 제프의 유명한“최고의 코드는 전혀 코드가 없습니다”를 직접 위반하는 것입니다. 이것이 정말로 정당화 되었습니까? 다른 한편으로, 이것이 의미하는 이유와 의미를 명시 적으로 만드는 것이 바람직한 이유를 알 수 있습니다. 이 경우 VB가 객체 평등을 다루는 방식을 선호합니다. 이 짧다 하고 모호하지.
Konrad Rudolph

@ Konrad, 나는 정말 "유형에 익숙하지 않을 때 가장 좋은 방법은 다음과 같습니다"라고 말했습니다. 그렇습니다. VB는 의미와 가치가 평등을 분리하기 때문에 의미가 훨씬 뛰어납니다. C #은이 두 가지를 혼합하여 때때로 모호성 오류를 유발합니다.
JaredPar

10
이것은 전적으로 사실이 아닙니다. == 재정의 할 수 없으며 정적 메서드입니다. 오버로드 만 가능하며 이는 중요한 차이점입니다. 따라서 == 연산자에 대해 실행되는 코드는 컴파일 타임에 연결되는 반면 Equals는 가상이고 실행 시간에 발견됩니다.
Stefan Steinegger

20

== 연산자

  1. 피연산자가 값 유형 이고 해당 이 같으면 true를 리턴하고 그렇지 않으면 false를 리턴합니다.
  2. 피연산자가 문자열을 제외한 참조 유형 이고 둘 다 동일한 인스턴스 (같은 오브젝트)를 참조하는 경우 true를 리턴하고 그렇지 않으면 false를 리턴합니다.
  3. 피연산자가 문자열 유형이고 해당 이 같으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

. 같음

  1. 피연산자가 참조 유형 인 경우 둘 다 동일한 인스턴스 (동일한 오브젝트)를 참조하는 경우 참조 평등 을 수행 합니다. 그렇지 않으면 true를 리턴합니다.
  2. 피연산자가 값 유형 인 경우 == 연산자와 달리 유형을 먼저 확인하고 해당 유형이 동일한 경우 == 연산자를 수행하고 그렇지 않으면 false를 리턴합니다.

2
이것은 정확하지 않습니다. ==연산자뿐만 아니라 모든 유형 문자열을 오버로드 할 수 있습니다. 문자열에 대해서만 특수한 경우를 설명하면 연산자의 의미가 잘못 표시됩니다. "피연산자가 참조 유형 인 경우 적용 가능한 과부하가없는 한 피연산자가 동일한 오브젝트를 참조하는 경우 true를 리턴합니다.이 경우 해당 과부하의 구현으로 결과가 결정됩니다. ". Equals가상 방법이라는 추가 합병증에 대해서도 마찬가지입니다 . 따라서 동작을 오버라이드하거나 오버라이드 할 수 있습니다.
phoog

19

첫째, 거기 이다 차이. 숫자

> 2 == 2.0
True

> 2.Equals(2.0)
False

그리고 문자열

> string x = null;
> x == null
True

> x.Equals(null)
NullReferenceException

두 경우 모두 ==보다 더 유용하게 작동합니다.Equals


2
==연산자를 사용하여 정수 유형의 부동 소수점 유형으로의 강제 변환을 좋은 것으로 생각하지는 않습니다 . 예를 들어, 16777216.0f는 (int) 16777217, (double) 16777217.0과 같거나 같아야합니까? 정수 유형 간의 비교는 양호하지만 부동 소수점 비교는 일치 유형으로 명시 적으로 캐스트 된 값으로 만 IMHO를 수행해야합니다. a의 비교 float상 이외의 뭔가가 float, 또는은 double(A)보다 다른 것으로 double, 진단없이 컴파일 안 주요 코드 냄새로 저를 친다.
supercat

1
@supercat 나는 동의한다-그것은 (시도 하고 ) x == y암시하지 않는 고민이다 . x/3 == y/3x = 5y = 5.0
대령 패닉

/정수 나누기를 사용하는 것은 C # 및 Java 디자인의 결함 이라고 생각합니다 . 파스칼 div과 심지어 VB.NET의 ` are much better. The problems with ==`는 더 나쁩니다. x==y그리고 y==z그것을 암시하지는 않습니다 x==z(이전 의견에서 세 숫자를 고려하십시오). 당신이 경우에도, 제안의 관계에 관해서 xyfloat또는 둘 double, x.equals((Object)y)것을 의미하지는 않습니다 1.0f/x == 1.0F이 / y` (내 druthers이 있다면, 그것은 보장 할 것이다 경우에도이 ==긍정적 구별 제로하지 않습니다 Equals한다).
supercat

Equals ()의 첫 번째 매개 변수가 문자열이기 때문에 정상입니다!
Whiplash가

17

내가 이해하는 한 대답은 간단합니다.

  1. == 객체 참조를 비교합니다.
  2. .Equals 객체 내용을 비교합니다.
  3. String 데이터 유형은 항상 컨텐츠 비교처럼 작동합니다.

나는 정확하고 귀하의 질문에 답변 되었기를 바랍니다.


15

객체를 문자열로 캐스팅하면 올바르게 작동한다고 덧붙입니다. 이것이 컴파일러가 경고 메시지를 표시하는 이유입니다.

의도하지 않은 기준 비교; 값을 비교하려면 왼쪽을 'string'유형으로 캐스트하십시오.


1
바로 그거죠. @DominicCronin : 항상 컴파일 타임 경고를 준수하십시오. 당신이 가지고 있다면 object expr = XXX; if (expr == "Energy") { ... }, 왼쪽은 컴파일 타임 타입 object이기 때문에 컴파일러는 overload를 사용해야합니다 operator ==(object, object). 참조 평등을 확인합니다. 그 줄 것이다 여부 truefalse때문에 예측하기가 어려울 수 있습니다 문자열 인턴 . 당신이 경우 왼쪽 중 하나입니다 null또는 유형 string에 왼쪽 캐스트 string사용하기 전에 ==.
Jeppe Stig Nielsen

다른 방법으로 == (참조 동등 또는 값 동등 사용 여부를 결정할 때) 컴파일 시간 유형 / 정적 유형 / 왼쪽 유형에 따라 다릅니다. (컴파일 시간 분석에서 해결되는 유형입니다). 런타임 유형 / 동적 유형 / RHS 유형이 아닙니다. BlueMonkMN의 코드는 캐스팅이 아니라는 것을 보여줍니다.
barlop

5

.Equal메소드 의 정적 버전은 지금까지 언급되지 않았으므로 여기에 추가하여 세 가지 변형을 요약하고 비교하고 싶습니다.

MyString.Equals("Somestring"))          //Method 1
MyString == "Somestring"                //Method 2
String.Equals("Somestring", MyString);  //Method 3 (static String.Equals method) - better

어디 MyString코드에서 다른 곳에서 오는 변수입니다.

배경 정보 및 여름철 :

Java에서는 ==문자열을 비교하는 데 사용하지 않아야합니다. 두 언어를 모두 사용해야 ==하고 C #에서 사용이 더 나은 것으로 대체 될 수 있음을 알리기 위해 이것을 언급합니다 .

C #에서는 문자열 유형 인 경우 방법 1 또는 방법 2를 사용하여 문자열을 비교하는 데 실질적인 차이가 없습니다. 그러나 하나가 null이거나 다른 유형 (정수와 같은)이거나 다른 참조를 가진 객체를 나타내는 경우 초기 질문에서 알 수 있듯이 콘텐츠의 동등성을 비교하면 다음을 반환하지 않을 수 있습니다. 당신은 기대합니다.

제안 된 해결책 :

사용하는 ==것은 .Equals사물을 비교할 때 사용하는 것과 정확히 동일하지 않으므로 정적 String.Equals 메서드를 대신 사용할 수 있습니다 . 이 방법으로 양면이 같은 유형이 아닌 경우에도 내용을 비교하고 한쪽이 null이면 예외를 피할 수 있습니다.

   bool areEqual = String.Equals("Somestring", MyString);  

쓰는 것이 조금 더 좋지만 제 생각에는 사용하는 것이 더 안전합니다.

다음은 Microsoft에서 복사 한 정보입니다.

public static bool Equals (string a, string b);

매개 변수

a

비교할 첫 번째 문자열 또는 null.

b

비교할 두 번째 문자열 또는 null.

보고 Boolean

true의 값이 값과 a동일한 경우 b; 그렇지 않으면 false. 두 경우 ab있습니다 null, 메소드가 리턴 true.


5

이미 좋은 답변에 추가 된 것처럼 :이 동작은 문자열 또는 다른 숫자 유형을 비교하는 것으로 제한되지 않습니다. 두 요소 모두 동일한 기본 유형의 객체 유형 인 경우에도 마찬가지입니다. "=="이 작동하지 않습니다.

다음 스크린 샷은 두 객체 {int}-값을 비교 한 결과를 보여줍니다.

VS2017의 예


2

나는 여기에 약간 혼란 스럽다. Content의 런타임 유형이 문자열 유형 인 경우 ==와 Equals는 모두 true를 리턴해야합니다. 그러나 이것이 사실이 아닌 것처럼 보이기 때문에 런타임 유형의 Content가 문자열이 아니며 Equals를 호출하면 참조 평등이 수행되고 Equals ( "Energy Attack")가 실패하는 이유를 설명합니다. 그러나 두 번째 경우에는 오버로드 된 == 정적 연산자를 호출해야하는 결정이 컴파일 시간에 이루어지며이 결정은 == (string, string) 인 것으로 보입니다. 이것은 내용이 문자열에 암시 적 변환을 제공한다는 것을 나에게 제안합니다.


2
당신은 그것을 다시 앞으로 가지고 있습니다. 시작 Equals ( "Energy Attack")가 실패하지 않으면 ==는 false를 리턴하는 것입니다. ==는 문자열이 아니라 == from 객체를 사용하기 때문에 실패합니다.
MikeKulls

기본적으로 연산자 ==는 두 참조가 동일한 객체를 나타내는 지 여부를 결정하여 참조 평등을 테스트합니다. 따라서 참조 기능은이 기능을 얻기 위해 operator ==를 구현할 필요가 없습니다. 유형이 변경 불가능한 경우, 즉 인스턴스에 포함 된 데이터를 변경할 수없는 경우, 참조 등식 대신 값 등식을 비교하기 위해 연산자 ==를 오버로드하면 불변 객체로서 긴 것으로 간주 될 수 있기 때문에 유용 할 수 있습니다 그들은 같은 가치를 가지고 있습니다. 변경할 수없는 유형에서 operator ==를 재정의하는 것은 좋지 않습니다.
Wajeed-MSFT

2

@BlueMonkMN의 이전 답변에는 또 다른 차원이 있습니다. 추가 차원은 @Drahcir의 제목 질문에 대한 답변이 우리가 가치 에 어떻게 도달 했는지에 달려 있다는 것입니다 string. 설명하기 위해 :

string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
string s5 = "te" + "st";
object s6 = s5;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));

Console.WriteLine("\n  Case1 - A method changes the value:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));

Console.WriteLine("\n  Case2 - Having only literals allows to arrive at a literal:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s5), s1 == s5, s1.Equals(s5));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s6), s1 == s6, s1.Equals(s6));

출력은 다음과 같습니다.

True True True

  Case1 - A method changes the value:
False True True
False False True

  Case2 - Having only literals allows to arrive at a literal:
True True True
True True True

2

답변에 하나 이상의 포인트를 추가합니다.

.EqualsTo() 방법을 사용하면 문화 및 대소 문자를 구분할 수 있습니다.


0

==C # 의 토큰은 두 개의 다른 등식 검사 연산자에 사용됩니다. 컴파일러가 해당 토큰을 발견하면 비교중인 유형 중 하나가 비교중인 특정 조합 유형 (*) 또는 두 유형을 변환 할 수있는 유형 조합에 대해 동등 연산자 오버로드를 구현했는지 확인합니다. 컴파일러가 이러한 과부하를 찾으면이를 사용합니다. 그렇지 않으면 두 유형이 모두 참조 유형이고 관련이없는 클래스가 아닌 경우 (인터페이스이거나 관련 클래스 일 수 있음) 컴파일러는 ==참조 비교 연산자로 간주 합니다. 두 조건이 모두 적용되지 않으면 컴파일이 실패합니다.

일부 다른 언어는 두 개의 동등 검사 연산자에 대해 별도의 토큰을 사용합니다. 예를 들어 VB.NET에서 =토큰은 오버로드 가능한 동등성 검사 연산자만을위한 식 내에서 Is사용되며 참조 테스트 또는 null 테스트 연산자로 사용됩니다. 참조 동등성 또는 널 (NULL)을 테스트하는 것 이외의 다른 목적 =으로 사용하려고하면 동등성 검사 연산자를 대체하지 않는 유형에 대한 사용 은 실패 Is합니다.

(*) 유형은 일반적으로 자체와 비교하기 위해 과부하 동등성 만 있지만, 다른 특정 유형과 비교하기 위해 유형이 동등 연산자를 과부하하는 것이 유용 할 수 있습니다. 예를 들어, 16777217은 16777216f와 동일하게보고하지 않도록 int등호 연산자를 (와 float) 비교하여 등호 연산자를 정의했을 수 있습니다 (그러나 IMHO가 정의하지 않았어야했습니다). 그대로, 그러한 연산자가 정의되어 있지 않기 때문에 C #은 intto 를 승격시키고 float, 항등 검사 연산자가보기 전에 16777216f로 반올림합니다. 그런 다음 해당 연산자는 두 개의 동일한 부동 소수점 숫자를보고 발생 된 반올림을 인식하지 못하고 동일한 것으로보고합니다.


in-to-float 비교 반환 거짓을 갖는 대신 F #이 사용하는 접근 방식을 선호합니다.이 접근 방식은 그러한 비교를 전혀 허용하지 않습니다. 그런 다음 프로그래머는 값의 유형이 다른 사실을 처리할지 여부와 방법을 결정할 수 있습니다. 때로는 결국 우리 3 동등하게 취급하기 를 원하기 때문 3.0f입니다. 프로그래머가 모든 경우의 의도를 말하도록 요구하면 기본 동작이 없기 때문에 의도하지 않은 결과로 이어지는 기본 동작의 위험이 없습니다.
phoog

@phoog : 개인적으로 느끼는 언어는 "정상적인"평등 테스트 수단이 동등성 관계를 구현해야하며 그렇지 않을 피연산자의 모든 조합을 금지해야한다는 것입니다. 부동 소수점이 정수와 정확히 일치하는 정수를 정확하게 나타내는 지 확인하고 정수를 비교하는 것만으로도 정수와 부동 소수점 사이의 언어 검사 동등성을 갖는 큰 이점을 보지 못하지만 언어를 수행하는 것보다 우수한 접근법을 고려할 것입니다 비교 전의 손실 변환.
supercat

0

정말 좋은 답변과 예!

둘 사이의 근본적인 차이점을 추가하고 싶습니다.

==다형성이 아닌 연산자 Equals

이 개념을 염두에두고 왼손 및 오른손 참조 유형을보고 유형에 실제로 과부하가 걸리고 Equals가 재정의되는지 확인 / 알면 예제를 수행하면 정답을 얻을 수 있습니다. .


-1

객체를 만들 때 객체에 대한 두 부분이 있습니다. 하나는 내용이고 다른 하나는 그 내용에 대한 참조입니다. ==내용과 참조를 모두 비교합니다. equals()내용 만 비교

http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq


1
사실이 아닙니다. 경우 ab두 문자열 참조는,의 결과는 a == b참조가 동일한 개체를 가리 여부에 의존하지 않습니다.
phoog

-2

==

== 연산자는 모든 종류의 두 변수를 비교하는 데 사용될 수 있으며 단순히 비트를 비교합니다 .

int a = 3;
byte b = 3;
if (a == b) { // true }

참고 : int의 왼쪽에는 더 많은 0이 있지만 여기서는 신경 쓰지 않습니다.

int a (00000011) == 바이트 b (00000011)

== 연산자는 변수의 비트 패턴에만 관심을 둡니다.

두 개의 참조 (기본)가 힙의 동일한 오브젝트를 참조하는 경우 ==를 사용하십시오.

변수가 참조인지 프리미티브인지에 관계없이 규칙이 동일합니다.

Foo a = new Foo();
Foo b = new Foo();
Foo c = a;

if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }

a == c는 true a == b는 false

비트 패턴은 a와 c에서 동일하므로 ==를 사용하여 동일합니다.

같은():

equals () 메소드를 사용하여 두 개의 다른 객체가 같은지 확인하십시오 .

"Jane"의 문자를 나타내는 두 개의 다른 String 객체와 같은


2
이것은 올바르지 않습니다. 다음을 고려하십시오 object a = 3; object b = 3; Console.WriteLine(a == b);.. 값의 비트 패턴이 동일하더라도 출력이 false입니다. 피연산자의 유형도 중요합니다. 예제에서 다른 수의 0에 대해 신경 쓰지 않는 이유는 equals 연산자를 호출 할 때 암시 적 변환으로 인해 실제로 0이 되기 때문입니다.
phoog

-2

같음과 ==의 유일한 차이점은 객체 유형 비교에 있습니다. 참조 유형 및 값 유형과 같은 다른 경우에는 거의 동일합니다 (둘 다 비트 단위 평등 또는 둘 다 참조 평등).

객체 : 같음 : 비트 별 같음 == : 참조 같음

문자열 : (같음과 ==는 문자열에 대해 동일하지만 문자열 중 하나가 객체로 변경되면 비교 결과가 달라집니다) 같음 : 비트 별 같음 == : 비트 별 같음

자세한 설명 은 여기 를 참조 하십시오 .


Object.Equals가 반드시 비트 단위 동등성을 보지는 않습니다. 가상 방법이며 재정의는 원하는 모든 작업을 수행 할 수 있습니다.
phoog

그렇습니다, 당신이 옳습니다. 당신은 그것을 무시하고 싶은 모든 것을 할 수 있습니다. 그러나 우리가 이야기하는 주제는 기본 구현입니다. Object.Equals의 기본 구현은 비트 단위 평등입니다.
Will Yu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.