2011-08-09 4 views
5

내가 최근에 C#을선택 System.String 구현

string str = "u r awesome"; 
str[0]="i"; 

에서 다음을 수행하려고했다 그리고 분명히 STR [내가] 만하지 세트이기 때문에 작동하지 않을 기본, 그래서 내가 궁금해서 무엇을 string의 기본 구현은 str [i]가 get이되도록 강제 할 것입니다.

char *에 대한 관리되는 래퍼가 아닌가요? 그러면 왜 내가 str을 설정할 수 없습니까? 닷넷 String 클래스는 불변 때문에

답변

3

다른 사람이 불변성에 관한 준 대답은 물론 올바른로하고 당신이 가진 문제의 "실제"원인이다.

당신은 특별히 기본이되는 구현에 대해 질문 (그냥 호기심 경우)이 질문에 우연히 수도 다른 사람에게 참고로, 여기 Eric Lippert에서 해당 항목에 대한 좀 더 많은 정보 때문에 :

".NET CLR에서 문자열은 메모리에 거의 동일하게 배열됩니다. BSTR이 OLE 자동화에 구현 된 방법 : 단어로 정렬 길이가 4 바이트 정수로 구성된 메모리 버퍼 문자열 2 바이트의 0 바이트가 뒤에 오는 UTF-16 데이터의 2 바이트 덩어리의 문자열 문자가 계속됩니다. "

"꽤 많은"부분을 유의하십시오. 그러나 BSTR 자체는 Eric's blog에도 설명되어 있습니다.

이 모든 것이 구현 세부 사항으로 간주됩니다. 그리고 비록 우리 대부분을 정말로 염려하지 않아야 할 것이지만, interop 이슈를 디버깅하거나 일반적으로 이해하는 동안 도움을 줄 수 있습니다.

+0

이것은 실제로 문자열이 구현 된 방법에 대한 구체적 답변을 찾았습니다. 감사합니다. – etk1220

8

당신은 문자열의 문자를 설정할 수 없습니다 - 그게 만든 후 그 내용이 변경 될 수 없음을 의미합니다. 이렇게하면 같은 문자열 인스턴스가 여러 번 안전하게 사용될 수 있습니다. 한 객체가 다른 객체가 해당 문자열을 스톰핑하는 것을 걱정하지 않고도 안전하게 사용할 수 있습니다.

문자열을 조작 할 수있는 변경 가능한 클래스가 필요한 경우 StringBuilder을 대신 사용해보십시오.

C와 비교하려면 String 유형은 const char *과 유사하지만 constness를 그냥 버릴 수는 없습니다. StringBuilderchar * (자동 할당 크기 조정)과 비슷하며 새로운 내용의 String 인스턴스를 만들려면 (ToString()) 메소드와 같습니다.

cdhowie 응답처럼
+0

관련 항목 : StringBuilder 내부 정보 http://stackoverflow.com/q/3564906/38206 –

2

, 그것은 C에서 문자열의 개념과 동일하지 않습니다/C++

당신은 다음과 같이 컨테이너를 통해 구현을 모방하기 위해 시도 할 수 있습니다 제안으로

당신이 위의 원하는 경우,

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

구체적인 용도는 문자열 만들기를 허용하는 것이므로 'StringBuilder'를 사용하는 것이 좋습니다. – cdhowie

+1

가 완전히 동의합니다. 코드 제안은 실제로 요소를 인덱스로 조작하려는 경우 대체 구현에서 어떻게 etk를 표시하려고 하는지를 보여줍니다. –

+3

'StringBuilder'에는 정확하게 허용되는 [인덱서] (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx)가 있습니다. :) – cdhowie