2012-02-17 3 views
22

문자열의 길이가 가변적 인 것을 알고 있으므로 저장할 변수 공간이 필요합니다. struct에 문자열 항목을 정의하면 struct의 크기는 가변적입니다.구조체의 문자열 관리 C# #

이전 언어는 고정 길이 문자열을 사용하여이를 관리했습니다. 그러나 C#에서는 고정 길이 문자열을 정의 할 방법이 없으며 C#은 보통 문자열을 struct에서 매우 잘 관리합니다.

이 배열은 struct 또는 단순히 문자열 배열을 정의 할 때 더욱 이상합니다. 한 문자열의 길이가 변경 (감소/증가) 된 결과로 모든 앞으로 struct을 이동해야합니다.

C#은 가변 길이 문자열을 구조체에서 어떻게 처리합니까?

+2

C#이 C가 아닙니다. 메모리가 둘 다 동일한 방식으로 관리된다고 가정하고 있습니다. – Oded

+0

그래 ... 내 잘못이야. –

답변

37

문자열에 대한 참조 (값 유형이 아님)가 구조체에 저장되므로 구조체 크기가 변경되지 않습니다.

+1

+1 매우 간결! – Candide

+0

"가치 유형입니까?" – Krythic

+0

아니요, 문자열은 [값 유형] (https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx)이 아닙니다. – jjlin

5

+1이 질문에 간결하고 정확한 답변을 jjlin 것이 아니라보다 일반적인 대답은 유용 할 수 있습니다 : 참조

필드 또는의 변수 선언 참조 유형은 참조 용 저장 위치 을 나타냅니다. 이것은 struct의 필드에도 적용됩니다.

(구조체 참조 타입의 필드를 포함하여 안전하지 않은 코드의 중요한 유형은 "관리되는 형식"을 만들어, 당신이 관리되는 형식에 대한 포인터를 선언 할 수 없습니다.)

9

내 첫 번째 질문에 고정 길이 문자열이 필요하다는 요구 사항이 필요합니까? 그렇다면 실제로 char []가 사용하려고하는 것일 수 있습니다.

.NET 프레임 워크는 C 스타일 문자열 (char 배열)을 직접 사용하지 않고 대신 불변 참조로 문자열을 나타냅니다. 문자열을 추가하거나 수정하면 실제로 메모리에 새로운 문자열 객체가 생성됩니다. 이것은 플랫폼의 원하는 기능이지만 마술처럼 크기를 조정하는 문자열을 기대할 때 고려해야하는 것은 원하지 않는 부작용을 유발할 수 있습니다.

질문으로 돌아 가기. "C#은 구조체의 문자열을 어떻게 관리합니까?" 내가 무엇을보고에서이 문제를 해석하는 방법은 두 가지의

하나 :

1). 문자열을 포함하는 구조체는 어떻게 만들 수 있습니까? .NET Framework는이 시나리오에서 문자열을 어떻게 관리합니까?

간단한 대답 : 문자열은 변경 불가능한 유형이라는 점에 유의하십시오. 구조체를 정상적으로 만들고 구조체에는 문자열에 대한 참조 만 포함하고 휘발성 문자열을 포함하도록 확장되는 구조체의 마술처럼 크기를 조정하는 세그먼트는 포함되지 않습니다.

2). 구조체가 나타내는 값 형식 인 경우 .NET Framework에서 문자열의 크기를 조정할 수있는 방법은 무엇입니까?

짧은 대답, 그렇지 않습니다. 이것은 방법이 아닙니다.NET은 문자열로 작동합니다 (위 참조).

+1

감사합니다. 아니, 나는 문자열에 만족합니다. 구조체와 문자열 배열에 대한 작업의 시간 복잡성에 대해 걱정했습니다. 이제 저는 그 트릭을 알고 있습니다 : "문자열에 대한 참조". –

+0

강력한 조작과 돌연변이의 효율성이 염려되는 경우 StringBuilder 클래스 사용을 고려하십시오. – Firoso

-5

구조체를 스택에 저장하고 힙에 문자열 저장소를 저장합니다.

기본 유형과 동일 스택 및 참조 유형 저장은 힙을 저장합니다.