Programing

== 이상의 String.Equals를 사용하는 이유는 무엇입니까?

lottogame 2020. 3. 14. 10:03
반응형

== 이상의 String.Equals를 사용하는 이유는 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

최근에 큰 코드베이스를 도입했으며 모든 문자열 비교가 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, str4obj2참조는 동일합니다.

obj하고 obj2있는 object type다른 사람들은string type

결론 :

  1. com1 : 결과 = (obj == str2); // true
    • 참조 평등 검사를 비교 object하고 string수행
    • obj와 str2는 동일한 참조를 가리 키므로 결과는 true입니다.
  2. com2 : 결과 = (obj == str3); // false
    • 참조 평등 검사를 비교 object하고 string수행
    • obj와 str3은 다른 참조를 가리 키므로 결과는 false입니다.
  3. com3 : 결과 = (obj == str4); // true
    • 참조 평등 검사를 비교 object하고 string수행
    • obj와 str4는 동일한 참조를 가리 키므로 결과는 true입니다.
  4. com4 : 결과 = (str2 == str3); // true
    • 비교 string하고 string문자열 값 검사를 수행합니다.
    • str2와 str3은 모두 "String"이므로 결과는 true입니다.
  5. com5 : 결과 = (str2 == str4); // true
    • 비교 string하고 string문자열 값 검사를 수행합니다.
    • str2와 str4는 모두 "String"이므로 결과는 true입니다.
  6. com6 : 결과 = (str3 == str4); // true
    • 비교 string하고 string문자열 값 검사를 수행합니다.
    • str3과 str4는 모두 "String"이므로 결과는 true입니다.
  7. 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에 작성된대로 :

그러나 문자열 인스턴스 중 하나가 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

반응형