이 동작을 이해하는 데 도움이됩니다. 나는이를 사용하는 경우 :컴파일하는 동안 C# 연결 문자열
bool a1 = (object)("string" + 1) == ("string" + 1);
결과는 false
입니다하지만이
bool a2 = (object)("string" + "1") == ("string" + "1");
을 사용할 때 결과는 왜 a1 != a2
그래서 true
입니까?
이 동작을 이해하는 데 도움이됩니다. 나는이를 사용하는 경우 :컴파일하는 동안 C# 연결 문자열
bool a1 = (object)("string" + 1) == ("string" + 1);
결과는 false
입니다하지만이
bool a2 = (object)("string" + "1") == ("string" + "1");
을 사용할 때 결과는 왜 a1 != a2
그래서 true
입니까?
캐스팅을 object
은 참조 동등 비교를 강제합니다.
첫 번째 경우에는 두 개의 다른 string
개체가 런타임에 생성됩니다. 서로 다른 인스턴스이므로 결과는 false입니다.
두 번째 경우 컴파일러는 이 항상 "string1"
이 될 것이며, 인턴트를 수행하고 두 위치에서 동일한 참조를 사용함을 알게됩니다. 동일한 문자열 참조이기 때문에 결과는 true입니다.
은 여기에 무슨 중요한 두 가지가 있습니다 "string" + "1"
이 컴파일시에 평가 중에
는 첫째, 표현 "string" + 1
는 실행시에 평가됩니다.
두 번째로 참조 비교를 사용하고 있습니다. 런타임에 생성 된 문자열은 실제로 다른 객체를 참조하는 반면 컴파일 타임 생성 문자열은 동일한 객체를 참조하므로 첫 번째 표현식은 false
이고 두 번째 표현식은 true
입니다. 어쨌든 "=="
// bool a1 = (object)("string" + 1) == ("string" + 1);
// bool a2 = (object)("string" + "1") == ("string" + "1");
IL_0000: ldstr "string"
IL_0005: ldc.i4.1
IL_0006: box System.Int32
IL_000B: call System.String.Concat
IL_0010: ldstr "string"
IL_0015: ldc.i4.1
IL_0016: box System.Int32
IL_001B: call System.String.Concat
IL_0020: ceq
IL_0022: stloc.0 // a1
IL_0023: ldstr "string1"
IL_0028: ldstr "string1"
IL_002D: ceq
IL_002F: stloc.1 // a2
+1 게시 IL : P –
깔끔한. 어떻게 IL이 이런 식으로 보일지 언급 할 필요가 있습니까? – kenchilada
@radium 개인적으로 [ILSpy] (http://ilspy.net/)를 사용합니다. –
나는 이유를 정확히 모르겠지만, 난 당신이 사용하는 문자열의 품질을 확인하지 않아야 알고 당신이 관심이 있다면
, 생성 된 IL이다. object1.equals (object2)는 최소한 내 이해를 위해 그렇게 할 수있는 방법입니다. 아마 당신의 질문에 대답하지 않기 때문에 대답으로 게시하지 않았다. –
이것을 확인하십시오 : http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani
@Ricky Mutschlechner : AFAIK 연산자 '=='== '. equals'. ;-) –