2012-02-01 2 views
4

문자열을 SubString() 메서드를 사용하여 만들면 결과 문자열에 원래 문자열의 요소 사본이 생깁니다. (따라서 동일한 정보를 가진 두 개의 메모리 위치가 있습니다) 또는 기존 메모리 위치에 대한 참조입니다 ?String.Substring() : 복사 또는 참조?

사본 인 경우 참조로 사용할 수있는 방법이 있습니까?

답변

5

C에서 문자열은 불변 *이지만 은 지속되지 않습니다입니다. 즉, SubString 메서드의 결과 인 새 문자열은 이전 문자열과 공통된 부분을 공유하지 않습니다. Here은 에릭 리 퍼트 (Eric Lippert)의 아름다운 설명입니다.

* 문자열에 대한 연산은 새 문자열 객체를 반환합니다.

5

사본이며 다른 문자열의 일부에 대한 참조 인 string을 사용할 수 없습니다. 닷넷 문자열은 배열에 의해 뒷받침되지 않고 char 데이터 인라인을 포함합니다. 즉 배열과 비슷한 가변 길이 클래스입니다.

그 하위 참조 모델은 가능한 구현입니다 (자바 문자열은 문자 배열로의 슬라이스라고 생각합니다). 작은 부분 문자열을 유지하면 전체 문자열이 메모리에 유지되는 이상한 행동으로 이어질 수있는 일반적인 함정 java 하위 문자열. 나는. NET 디자이너가 그런 문제를 피하기를 원했던 것으로 생각한다.

이 속성이있는 사용자 지정 문자열 형식을 사용할 수 있습니다. 예를 들어 슬라이스를 ArraySegment<char> 문자 배열로 작업 할 수 있습니다.

0

새 문자열입니다. 다른 문자열의 시작 및 끝 위치를 유지하는 말을 할 수 있습니다 (예 : 호출 한 경우 하위 문자열에 전달할 인수). 고정 패턴 인 경우 (또는 적어도 알려진 간격으로 고정 될 수 있다면 사전에 잘라내거나 StringBuilder 또는 Stream을 TextReader로 사용할 수 있습니다.)

부분 문자열이 문제인 경우 불변의 문자열을 사용하는 언어에서, 당신은 그 필요성을 디자인해야만한다. 그것은 편리하지만 하나 일 것이다.