2013-06-27 5 views
21

이 동작을 이해하는 데 도움이됩니다. 나는이를 사용하는 경우 :컴파일하는 동안 C# 연결 문자열

bool a1 = (object)("string" + 1) == ("string" + 1); 

결과는 false

입니다하지만이

bool a2 = (object)("string" + "1") == ("string" + "1"); 

을 사용할 때 결과는 왜 a1 != a2 그래서 true

입니까?

+0

나는 이유를 정확히 모르겠지만, 난 당신이 사용하는 문자열의 품질을 확인하지 않아야 알고 당신이 관심이 있다면

, 생성 된 IL이다. object1.equals (object2)는 최소한 내 이해를 위해 그렇게 할 수있는 방법입니다. 아마 당신의 질문에 대답하지 않기 때문에 대답으로 게시하지 않았다. –

+0

이것을 확인하십시오 : http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani

+1

@Ricky Mutschlechner : AFAIK 연산자 '=='== '. equals'. ;-) –

답변

34

캐스팅을 object은 참조 동등 비교를 강제합니다.

첫 번째 경우에는 두 개의 다른 string 개체가 런타임에 생성됩니다. 서로 다른 인스턴스이므로 결과는 false입니다.

두 번째 경우 컴파일러는 이 항상 "string1"이 될 것이며, 인턴트를 수행하고 두 위치에서 동일한 참조를 사용함을 알게됩니다. 동일한 문자열 참조이기 때문에 결과는 true입니다.

+2

@OP 그냥 추가하면 String.Equals – Mataniko

+0

+1과 문자열을 항상 비교해야합니다. 나는이 대답을 좋아한다. 고마워요 :) –

+10

@Mataniko 아니, 당신은 당신의 변수가'operator =='를 사용한다면 컴파일 타임 타입 문자열인지 확인해야합니다. 하나 이상의 객체가'string'에 정적으로 타입이 지정되지 않은 경우에만'string.Equals'를 사용하십시오 (이것은 매우 드물 것입니다). – Servy

19

은 여기에 무슨 중요한 두 가지가 있습니다 "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 
+3

+1 게시 IL : P –

+0

깔끔한. 어떻게 IL이 이런 식으로 보일지 언급 할 필요가 있습니까? – kenchilada

+1

@radium 개인적으로 [ILSpy] (http://ilspy.net/)를 사용합니다. –