2017-10-12 5 views
-1

정확히 어떻게 추가 기능이 StringBuilder에서 작동하는지 설명해야하는 게시물을 찾으려고했습니다. C# 어떻게 StringBuilder를 변경할 수 있습니까?

내가 지금이 answer.

을 통해 가지고, 문자열은 변경할 수 없습니다. 나는 이걸 얻는다. 우리가 뭔가를 추가하려고 할 때마다

그러나

은 모두 StringBuilder는 새 임시 문자 배열을 초기화하는 중입니다.

+0

당신은 [여기] 코드 읽을 수 있습니다 (https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs). 긴 이야기 짧게 : StringBuilder는 char 배열에 의해 뒷받침됩니다. – john

+0

[string이 불변이고 stringbuilder가 변경 가능합니다] 가능한 복제본 (https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –

+0

두 개의 서로 다른 개체입니다. 문자열은 변경할 수 없습니다. StringBuilder가 아닙니다. StringBuilder가 String으로 시작한다는 사실은 필연적으로 변경 불가능하다는 것을 의미하지는 않습니다. :) – user1506104

답변

1

변경 가능한 그것은 새로운 물건을 만들 수 없다는 것을 의미하는 것은 아니다. 변경 가능하다는 것은 생성자가 반환 한 후에 상태가 변경 될 수 있음을 의미합니다.

예를 들어

,이 string는 불변 경우에도 변경할 수 있습니다 :

someFoo.FooMethod(); 

예, 내가 :

class Foo { 
    public string Bar { get; set; } 

    public void FooMethod() { 
     Bar = new string('!', 10); 
    } 
} 

우리는 Bar을 설정하거나 FooMethod를 호출하여 상태를 변경할 수 있기 때문에 새 string을 여기에 FooMethod에 작성했지만 문제가되지 않습니다. 문제는 현재 Bar에 새로운 가치가 있다는 것입니다. someFoo의 상태가 변경되었습니다.

StringBuilder을 새로 만들지 않고 상태가 변경 될 수 있기 때문에 StringBuilder이 변경 가능하다고 가정합니다. 찾은대로 StringBuilder은 문자 배열을 저장합니다. 추가 할 때마다 char 배열이 다른 것으로 바뀌지 만 새로운 StringBuilder은 생성되지 않습니다. 이것은 StringBuilder이 변경 가능하다는 확실한 증거입니다.

+0

StringBuilder를 변경할 수있는 이유를 언급 할 수도 있습니다. String 개체는 변경할 수 없습니다. String 클래스의 메서드 중 하나를 사용할 때마다 새 문자열 개체를 메모리에 만듭니다. 새 문자열 개체는 새 개체에 대한 공간을 새로 할당해야합니다. 문자열을 반복적으로 수정해야하는 상황에서는 새 String 객체를 만드는 것과 관련된 오버 헤드가 값 비쌉니다. StringBuilder 클래스는 새 객체를 만들지 않고 문자열을 수정하려는 경우 사용할 수 있습니다. https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma

-1

*Builder 패턴은, 물체, 특히 불변 오브젝트를 생성 단순히 생성자 데이터의 무리 전달보다 풍부한 인터페이스를 사용하는 공통 패턴이다. 는 실제 데이터가 결국를 입력 필요가 있기 때문에 클래스 X 및 클래스 XBuilder 사이의 관계는 일반적으로 그냥 임시의, XBuilder는 불변 할 필요가없는 X를 구축 할 수 있습니다 불변 XXBuilder 될 것입니다 X을 만들기위한 발판.

즉, StringBuilderstring의 변형 버전이 아닙니다. 이 클래스는 변경 불가능한 string을 만드는 데 도움이되는 기능 단위입니다. 당신은 StringBuilder가 최종 문자열에 수 (논리적으로, 아직 존재하는), 그리고이 완료되면 다음, 내 생각, myStringBuilder.ToString()을 (를 호출해야하는지 정의하는 다양한 Append 방법을 사용하여 인스턴스화해야 BuildString())를 사용하여 원하는 실제 문자열을 가져옵니다.