== 이상의 String.Equals를 사용하는 이유는 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
- ==와 Equals ()의 C # 차이 17 답변
최근에 큰 코드베이스를 도입했으며 모든 문자열 비교가 String.Equals()
대신에 사용 됩니다.==
이것에 대한 이유는 무엇입니까?
개발자 기반의 많은 부분이 ==
문자열을 비교하는 데 잘못되어 작동하지 않는 Java 배경에서 비롯된 것 같습니다.
C #에서는 문자열로 입력되는 한 (실제적으로) 문자열에 대한 차이가 없습니다.
그것들이 유형으로 입력 object
되었거나 T
여기에 다른 메소드를 볼 경우 Equals 메소드를 사용하고 싶을 때 일반 메소드 또는 연산자 과부하에 대해 이야기합니다.
string.Equals
와 사이에 실질적인 차이가 있습니다==
bool result = false;
object obj = "String";
string str2 = "String";
string str3 = typeof(string).Name;
string str4 = "String";
object obj2 = str3;
// Comparision between object obj and string str2 -- Com 1
result = string.Equals(obj, str2);// true
result = String.ReferenceEquals(obj, str2); // true
result = (obj == str2);// true
// Comparision between object obj and string str3 -- Com 2
result = string.Equals(obj, str3);// true
result = String.ReferenceEquals(obj, str3); // false
result = (obj == str3);// false
// Comparision between object obj and string str4 -- Com 3
result = string.Equals(obj, str4);// true
result = String.ReferenceEquals(obj, str4); // true
result = (obj == str4);// true
// Comparision between string str2 and string str3 -- Com 4
result = string.Equals(str2, str3);// true
result = String.ReferenceEquals(str2, str3); // false
result = (str2 == str3);// true
// Comparision between string str2 and string str4 -- Com 5
result = string.Equals(str2, str4);// true
result = String.ReferenceEquals(str2, str4); // true
result = (str2 == str4);// true
// Comparision between string str3 and string str4 -- Com 6
result = string.Equals(str3, str4);// true
result = String.ReferenceEquals(str3, str4); // false
result = (str3 == str4);// true
// Comparision between object obj and object obj2 -- Com 7
result = String.Equals(obj, obj2);// true
result = String.ReferenceEquals(obj, obj2); // false
result = (obj == obj2);// false
시계 추가
obj "String" {1#} object {string}
str2 "String" {1#} string
str3 "String" {5#} string
str4 "String" {1#} string
obj2 "String" {5#} object {string}
지금보고 {1#}
및{5#}
obj
, str2
, str4
및 obj2
참조는 동일합니다.
obj
하고 obj2
있는 object type
다른 사람들은string type
결론 :
- com1 : 결과 = (obj == str2); // true
- 참조 평등 검사를 비교
object
하고string
수행 - obj와 str2는 동일한 참조를 가리 키므로 결과는 true입니다.
- 참조 평등 검사를 비교
- com2 : 결과 = (obj == str3); // false
- 참조 평등 검사를 비교
object
하고string
수행 - obj와 str3은 다른 참조를 가리 키므로 결과는 false입니다.
- 참조 평등 검사를 비교
- com3 : 결과 = (obj == str4); // true
- 참조 평등 검사를 비교
object
하고string
수행 - obj와 str4는 동일한 참조를 가리 키므로 결과는 true입니다.
- 참조 평등 검사를 비교
- com4 : 결과 = (str2 == str3); // true
- 비교
string
하고string
문자열 값 검사를 수행합니다. - str2와 str3은 모두 "String"이므로 결과는 true입니다.
- 비교
- com5 : 결과 = (str2 == str4); // true
- 비교
string
하고string
문자열 값 검사를 수행합니다. - str2와 str4는 모두 "String"이므로 결과는 true입니다.
- 비교
- com6 : 결과 = (str3 == str4); // true
- 비교
string
하고string
문자열 값 검사를 수행합니다. - str3과 str4는 모두 "String"이므로 결과는 true입니다.
- 비교
- com7 : result = (obj == obj2); // false- 참조 평등 검사를 비교
object
하고object
수행하므로 obj와 obj2는 다른 참조를 가리 키므로 결과는 false입니다.
==와 String 사이 에는 미묘하지만 매우 중요한 차이점 이 있습니다.
class Program
{
static void Main(string[] args)
{
CheckEquality("a", "a");
Console.WriteLine("----------");
CheckEquality("a", "ba".Substring(1));
}
static void CheckEquality<T>(T value1, T value2) where T : class
{
Console.WriteLine("value1: {0}", value1);
Console.WriteLine("value2: {0}", value2);
Console.WriteLine("value1 == value2: {0}", value1 == value2);
Console.WriteLine("value1.Equals(value2): {0}", value1.Equals(value2));
if (typeof(T).IsEquivalentTo(typeof(string)))
{
string string1 = (string)(object)value1;
string string2 = (string)(object)value2;
Console.WriteLine("string1 == string2: {0}", string1 == string2);
}
}
}
이 출력을 생성합니다.
value1: a value2: a value1 == value2: True value1.Equals(value2): True string1 == string2: True ---------- value1: a value2: a value1 == value2: False value1.Equals(value2): True string1 == string2: True
== 연산자가 두 개의 분명히 동일한 문자열에 대해 false 를 반환하고 있음을 알 수 있습니다 . 왜? 제네릭 메서드에서 사용되는 == 연산자는 System.Object에 의해 정의 된 op_equal 메서드 (컴파일 타임에 메서드가 T를 보장하는 유일한 방법)로 확인되므로 값 평등 대신 참조 평등임을 의미합니다.
System.String으로 명시 적으로 입력 된 두 개의 값이있는 경우 컴파일러는 =.를 System.Object.op_equal 대신 System.String.op_equal로 해석하므로 ==에는 값 평등 의미가 있습니다.
따라서 안전하게 재생하려면 거의 항상 String을 사용합니다. 대신 항상 원하는 값 평등 의미를 얻습니다.
그리고 값 중 하나가 null 인 경우 NullReferenceExceptions을 피하기 위해 항상 정적 String.Equals 메서드를 사용합니다 .
bool true = String.Equals("a", "ba".Substring(1));
String.Equals
케이싱 및 문화 인식 비교를 처리하기 위해 과부하를 제공합니다. 코드에서 이들을 사용하지 않으면 개발자는 Java에 익숙 할 수 있습니다 (Mattheth가 말한 것처럼). 콘텐츠 비교를 수행하려면 .Equals 메소드를 사용해야합니다.
두 방법 모두 기능적으로 동일하게 작동 하며 값 을 비교 합니다 .
MSDN에 작성된대로 :
String.Equals
메서드 정보 -이 인스턴스와 지정된 다른 String 객체의 값이 같은지 확인합니다. ( http://msdn.microsoft.com/en-us/library/858x0yyx.aspx )- 정보
==
-문자열이 참조 유형이지만 항등 연산자 (==
및!=
)는 참조가 아닌 문자열 객체의 값을 비교하기 위해 정의됩니다. 이것은 문자열 동등성 테스트를보다 직관적으로 만듭니다. ( http://msdn.microsoft.com/en-en/library/362314fe.aspx )
그러나 문자열 인스턴스 중 하나가 null 인 경우 이러한 메소드는 다르게 작동합니다.
string x = null;
string y = "qq";
if (x == y) // returns false
MessageBox.Show("true");
else
MessageBox.Show("false");
if (x.Equals(y)) // returns System.NullReferenceException: Object reference not set to an instance of an object. - because x is null !!!
MessageBox.Show("true");
else
MessageBox.Show("false");
에 작성자있다 이 문서 는 존 소총에서 일부 따옴표, 재미있을 찾을 수 있습니다. 사용법이 거의 같은 것 같습니다.
Jon Skeet은 Equals 인스턴스의 성능은 "줄이 짧으면 줄 길이가 길어질수록 그 차이가 완전히 무의미 해집니다"라고 말합니다.
나는이 페이지를 읽고 실제로는 거기에 의미있는 차이가 없다고 결론을 내렸기 때문에 버그를 해결하려고 노력하면서 벽에 머리를 부딪 쳤습니다. ==에서 같고 같습니다.
Object == 동일성은 실패하지만 .Equals는 성공합니다. 이게 말이 돼?
string a = "x";
string b = new String(new []{'x'});
Console.WriteLine("x == x " + (a == b));//True
Console.WriteLine("object x == x " + ((object)a == (object)b));//False
Console.WriteLine("x equals x " + (a.Equals(b)));//True
Console.WriteLine("object x equals x " + (((object)a).Equals((object)b)));//True
또 다른 차이점이 있다고 덧붙이고 싶습니다. Andrew가 게시 한 내용과 관련이 있습니다.
또한 소프트웨어에서 버그를 발견하는 것은 매우 성가신 일입니다. 다음의 간단한 예를 참조하십시오 (널 체크도 생략했습니다).
public const int SPECIAL_NUMBER = 213;
public bool IsSpecialNumberEntered(string numberTextBoxTextValue)
{
return numberTextBoxTextValue.Equals(SPECIAL_NUMBER)
}
컴파일되고 항상 반환 false
됩니다. 다음은 컴파일 오류가 발생합니다.
public const int SPECIAL_NUMBER = 213;
public bool IsSpecialNumberEntered(string numberTextBoxTextValue)
{
return (numberTextBoxTextValue == SPECIAL_NUMBER);
}
우리는 누군가가 다른 유형의 열거 형을 사용하여 비슷한 문제를 해결해야했습니다 Equals
. 버그의 원인임을 깨닫기 전에이 많은 시간을 읽을 것입니다. 특히 정의 SPECIAL_NUMBER
가 문제 영역 근처 에 있지 않은 경우 .
이것이 내가 필요하지 않은 상황에서 평등 사용을 반대하는 이유입니다. 약간의 형식 안전성이 손실됩니다.
참고 URL : https://stackoverflow.com/questions/1659097/why-would-you-use-string-equals-over
'Programing' 카테고리의 다른 글
자바 힙 용어 : 젊고 오래된 세대와 영원한 세대? (0) | 2020.03.14 |
---|---|
Lightsail과 EC2의 차이점은 무엇입니까? (0) | 2020.03.14 |
모든 전역 변수 / 지역 변수를 인쇄 하시겠습니까? (0) | 2020.03.14 |
Magento에서 간단한 'Hello World'모듈을 어떻게 만듭니 까? (0) | 2020.03.14 |
스칼라에서 전체 파일을 읽습니까? (0) | 2020.03.14 |