2012-04-11 3 views
6

우리 모두 알고 있듯이 문자열은 암시 적으로 인스턴스화됩니다. 즉, 하나의 객체에 대한 참조를 얻기 위해 new을 사용할 필요가 없음을 의미합니다. 이 첫 번째 줄이 나타납니다 그러나ldstr은 newobj를 내부적으로 구현합니까?

String first = new String(new char[] {'a'}); 
string second = "a"; 

: 때문에 항상 틀이를 돌보고있다, 나는 이런 식으로 뭔가를 한 경우에 따라서 나는 동일한 IL를 얻을 것이라는 나의 믿음이었다이의

newobj instance void [mscorlib]System.String::.ctor(char[]) 및 두 번째 ldstr "a"을 사용하여 완료했습니다.

문자열 참조를 얻으려면 ldstr은 내부적으로 newobj으로 전화를 걸 수 있으며이를 뒷받침 할 세부 사양/세부 정보는 어디에서 볼 수 있습니까?

답변

8

ldstr은 리터럴 문자열에 대한 참조를 per the documentation으로 제공합니다 (리터럴 문자열은 기본적으로 허용되므로 한 번만 생성됩니다). 첫 번째 문은 newobj 명령을 예상대로 사용하여 string의 정규 인스턴스를 만듭니다.

+0

감사합니다. @Brian, 전 문서가 어디에 있는지 몰랐습니다! –

1

string 단순히 new에 당신이 newobj를 볼 이유입니다, 참조 객체 유형에 대해 그쪽으로 기본적인 가이드 라인을 따른다. 당신이 뭔가를 작성하려고하면

Infact는, 그것은 newobj를 생성하지 않습니다 : 당신은 그냥

int a = 2; 
Console.WriteLine(a); 

를 작성하는 경우

int a = new int(); 
a = 2; 
Console.WriteLine(a); 

결과 IL은

IL_0000: ldc.i4.0  
IL_0001: stloc.0  
IL_0002: ldc.i4.2  
IL_0003: stloc.0  
IL_0004: ldloc.0  
IL_0005: call  System.Console.WriteLine 

될 것입니다 결과 IL은

입니다.
IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

할당 시점 (자연적으로 누락 된 행이 있습니다)과 차이가 없으므로 값 유형에 대해 이야기하고 있습니다.

+0

예. 누가 그 말을했다고 했지? 나는 값 유형에 같은 것을 unsing하는 것은 그 명령을 주입하지 않는다는 것을 보여준다. – Tigran

+0

@BrianRasmussen : 편집 된 답변으로 명확하게 나타납니다. – Tigran

+0

죄송합니다. 귀하의 지적에 대해 오해했습니다. –

관련 문제