왜 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
★★★★★★★★★★★★★★★★★」obj2
object type
는 ★★★★★★★★★★★★★★★★.string type
결론:
- com1: 결과 = (obj == str2);// true
object
★★★★★★★★★★★★★★★★★」string
합니다.- obj와 str2는 같은 참조를 가리키기 때문에 결과는 참입니다.
- com2: 결과 = (obj == str3);// false
object
★★★★★★★★★★★★★★★★★」string
합니다.- obj와 str3는 다른 참조를 가리키기 때문에 결과는 false입니다.
- com3: 결과 = (obj == str4);// true
object
★★★★★★★★★★★★★★★★★」string
합니다.- obj와 str4는 같은 참조를 가리키기 때문에 결과는 참입니다.
- 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: 결과 = (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.Equals
method - 이 인스턴스와 지정된 다른 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
'programing' 카테고리의 다른 글
섬네일 이미지 생성 (0) | 2023.04.20 |
---|---|
두 날짜 간의 일/월/년(일자) 차이를 구하는 방법은 무엇입니까? (0) | 2023.04.20 |
'마이크로소프트'ACE.OLEDB.12.0' 공급자가 로컬 시스템에 등록되어 있지 않습니다. (0) | 2023.04.20 |
역할 관리자 기능이 활성화되지 않았습니다. (0) | 2023.04.20 |
XAML의 #지역 (0) | 2023.04.20 |