programing

왜 String을 사용합니까?== 이상입니까?

yellowcard 2023. 4. 20. 20:45
반응형

왜 String을 사용합니까?== 이상입니까?

되었는데 는 ""를 사용하여 .String.Equals()==

이유가 뭐라고 생각하시나요?

은 Java 에서 온 Java 는 이 하고 있습니다.==현을 비교하는 것은 잘못된 것이고 효과가 없습니다.

C#으로 (string.

라고 되어 있는 는,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 ★★★★★★★★★★★★★★★★★」obj2object type는 ★★★★★★★★★★★★★★★★.string type

결론:

  1. com1: 결과 = (obj == str2);// true
    • object ★★★★★★★★★★★★★★★★★」string합니다.
    • obj와 str2는 같은 참조를 가리키기 때문에 결과는 참입니다.
  2. com2: 결과 = (obj == str3);// false
    • object ★★★★★★★★★★★★★★★★★」string합니다.
    • obj와 str3는 다른 참조를 가리키기 때문에 결과는 false입니다.
  3. com3: 결과 = (obj == str4);// true
    • object ★★★★★★★★★★★★★★★★★」string합니다.
    • obj와 str4는 같은 참조를 가리키기 때문에 결과는 참입니다.
  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: 결과 = (obj == obj2);// false - 비교object ★★★★★★★★★★★★★★★★★」object체크가 가 됩니다.obj는 obj2가 됩니다.obj2는 obj2가 됩니다.

==와 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를 반환하는 것을 볼 수 있습니다. 그 이유는 무엇입니까?일반 메서드에서 사용 중인 == 연산자는 시스템에서 정의한 op_method로 확인되기 때문입니다.오브젝트(컴파일 시에 메서드가 가지는 T의 유일한 보증). 즉, 값이 동일하지 않고 참조 동등함을 의미합니다.

[시스템(System)]라고 입력한 값이 2개 있는 경우.명시적으로 문자열을 지정하면, 컴파일러가 ==를 시스템으로 확인하므로 ==는 값 변환 시맨틱을 가집니다.시스템 대신 String.op_equal.object.op_equal.

그래서 안전을 위해서 거의 항상 String을 사용합니다.대신 나는 항상 내가 원하는 가치평등의 의미를 갖게 된다.

또한 값 중 하나가 null일 경우 NullReferenceExceptions를 피하기 위해 항상 static String을 사용합니다.동등한 방법:

bool true = String.Equals("a", "ba".Substring(1));

String.Equals케이스 및 배양 인식 비교를 처리하기 위한 과부하를 제공합니다.코드가 이것들을 사용하지 않는 경우는, (Matthew 가 말한 것처럼) Java 에만 익숙해져 있을 가능성이 있습니다.콘텐츠 비교 방법과 동일합니다.

두 방법 모두 동일한 기능을 수행하며 값을 비교합니다.
MSDN에 되어 있는 와 같이:

  • 해서에 String.Equalsmethod - 이 인스턴스와 지정된 다른 String 객체의 값이 동일한지 여부를 결정합니다.(http://msdn.microsoft.com/en-us/library/858x0yyx.aspx)
  • 해서에 == 연산자 )는 타입입니다.== ★★★★★★★★★★★★★★★★★」!=)는 참조가 아닌 문자열 객체의 값을 비교하기 위해 정의됩니다.이것에 의해, 문자열의 동일성에 대한 테스트가 보다 직관적으로 됩니다.(http://msdn.microsoft.com/en-en/library/362314fe.aspx)

그러나 문자열 인스턴스 중 하나가 늘인 경우 다음 방법은 다르게 작동합니다.

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 Sket은 인스턴스 Equals의 퍼포먼스가 "스트링이 짧을수록 약간 향상됩니다.스트링의 길이가 늘어날수록 그 차이는 완전히 작아집니다."라고 말합니다.

또 다른 차이점이 있다는 것을 덧붙이고 싶다.그것은 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이 버그의 원인임을 깨닫기 전에 몇 번이고 다시 읽어야 합니다. 히의 가 es의 경우, SPECIAL_NUMBER는 문제 영역 근처에 없습니다.

이것이 내가 필요하지 않은 상황에서 Equals를 사용하는 것을 정말로 반대하는 이유이다.활자 안전성이 떨어집니다.

저는 이 페이지를 읽고 실제로 의미 있는 차이가 없다는 결론을 내렸기 때문에 버그를 해결하려고 머리를 싸매고 있었습니다. ==에서 다른 결과를 얻을 수 있고 동등한 결과를 얻을 수 있다는 것을 알게 될 경우를 대비해서 이 링크를 여기에 게시하겠습니다.

개체 == 동등성은 실패하지만,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

언급URL : https://stackoverflow.com/questions/1659097/why-would-you-use-string-equals-over

반응형