Silverlight 응용 프로그램에서 2 개의 문자열을 비교하는 조건이 있습니다. 어떤 이유로 사용 ==
하면 true 를 .Equals()
반환하고 false 를 반환 합니다 .
코드는 다음과 같습니다.
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
왜 이런 일이 발생하는지에 대한 이유가 있습니까?
답변
때 ==
유형의 표현에 사용되는 object
, 그것은에 해결할 수 있습니다 System.Object.ReferenceEquals
.
Equals
는 virtual
메소드 일 뿐이며 이와 같이 동작하므로 재정의 된 버전이 사용됩니다 ( string
유형은 내용을 비교합니다).
답변
객체 참조를 문자열과 비교할 때 (객체 참조가 문자열을 참조하더라도), ==
문자열 클래스에 특정한 연산자 의 특수 동작 은 무시됩니다.
(인 스트링을 처리하지 않는) 통상은, 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
답변
==
그리고 .Equals
호출 사이트에서의 실제 유형과 실제 유형에 정의 된 동작에 의존합니다. 둘 다 메소드 / 연산자 일뿐이며 모든 유형에서 재정의되고 작성자가 원하는 동작을 제공 할 수 있습니다. 내 경험상 사람들이 .Equals
객체 에 구현 하는 것이 일반적 이지만 operator 구현은 무시하는 것이 일반적입니다 ==
. 즉, .Equals
실제로 값의 동등성을 ==
측정하는 동시에 동일한 참조인지 여부를 측정합니다.
정의가 유동적이거나 일반 알고리즘을 작성하는 새로운 유형으로 작업 할 때 가장 좋은 방법은 다음과 같습니다.
- C #에서 참조를 비교하려면
Object.ReferenceEquals
직접 사용 하십시오 (일반적인 경우에는 필요하지 않음) - 내가 사용하는 값을 비교하려면
EqualityComparer<T>.Default
경우에 따라 사용법 ==
이 모호 하다고 생각 되면 명확하게 Object.Reference
코드에서 equals를 사용 하여 모호성을 제거합니다.
에릭 리퍼 트 (Eric Lippert)는 최근 CLR에 두 가지 평등 방법이있는 이유에 대한 블로그 게시물을 작성했습니다. 읽을 가치가 있습니다
답변
== 연산자
- 피연산자가 값 유형 이고 해당 값 이 같으면 true를 리턴하고 그렇지 않으면 false를 리턴합니다.
- 피연산자가 문자열을 제외한 참조 유형 이고 둘 다 동일한 인스턴스 (같은 오브젝트)를 참조하는 경우 true를 리턴하고 그렇지 않으면 false를 리턴합니다.
- 피연산자가 문자열 유형이고 해당 값 이 같으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
. 같음
답변
첫째, 거기 이다 차이. 숫자
> 2 == 2.0
True
> 2.Equals(2.0)
False
그리고 문자열
> string x = null;
> x == null
True
> x.Equals(null)
NullReferenceException
두 경우 모두 ==
보다 더 유용하게 작동합니다.Equals
답변
내가 이해하는 한 대답은 간단합니다.
==
객체 참조를 비교합니다..Equals
객체 내용을 비교합니다.String
데이터 유형은 항상 컨텐츠 비교처럼 작동합니다.
나는 정확하고 귀하의 질문에 답변 되었기를 바랍니다.
답변
객체를 문자열로 캐스팅하면 올바르게 작동한다고 덧붙입니다. 이것이 컴파일러가 경고 메시지를 표시하는 이유입니다.
의도하지 않은 기준 비교; 값을 비교하려면 왼쪽을 ‘string’유형으로 캐스트하십시오.