정확히 어떻게 추가 기능이 StringBuilder에서 작동하는지 설명해야하는 게시물을 찾으려고했습니다. C# 어떻게 StringBuilder를 변경할 수 있습니까?
내가 지금이 answer.을 통해 가지고, 문자열은 변경할 수 없습니다. 나는 이걸 얻는다. 우리가 뭔가를 추가하려고 할 때마다
그러나
은 모두 StringBuilder는 새 임시 문자 배열을 초기화하는 중입니다.정확히 어떻게 추가 기능이 StringBuilder에서 작동하는지 설명해야하는 게시물을 찾으려고했습니다. C# 어떻게 StringBuilder를 변경할 수 있습니까?
내가 지금이 answer.을 통해 가지고, 문자열은 변경할 수 없습니다. 나는 이걸 얻는다. 우리가 뭔가를 추가하려고 할 때마다
그러나
은 모두 StringBuilder는 새 임시 문자 배열을 초기화하는 중입니다.변경 가능한 그것은 새로운 물건을 만들 수 없다는 것을 의미하는 것은 아니다. 변경 가능하다는 것은 생성자가 반환 한 후에 상태가 변경 될 수 있음을 의미합니다.
예를 들어,이 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
이 변경 가능하다는 확실한 증거입니다.
StringBuilder를 변경할 수있는 이유를 언급 할 수도 있습니다. String 개체는 변경할 수 없습니다. String 클래스의 메서드 중 하나를 사용할 때마다 새 문자열 개체를 메모리에 만듭니다. 새 문자열 개체는 새 개체에 대한 공간을 새로 할당해야합니다. 문자열을 반복적으로 수정해야하는 상황에서는 새 String 객체를 만드는 것과 관련된 오버 헤드가 값 비쌉니다. StringBuilder 클래스는 새 객체를 만들지 않고 문자열을 수정하려는 경우 사용할 수 있습니다. https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma
*Builder
패턴은, 물체, 특히 불변 오브젝트를 생성 단순히 생성자 데이터의 무리 전달보다 풍부한 인터페이스를 사용하는 공통 패턴이다. 는 실제 데이터가 결국를 입력 필요가 있기 때문에 클래스 X
및 클래스 XBuilder
사이의 관계는 일반적으로 그냥 임시의, XBuilder
는 불변 할 필요가없는 X를 구축 할 수 있습니다 불변 X
와 XBuilder
될 것입니다 X
을 만들기위한 발판.
즉, StringBuilder
은 string
의 변형 버전이 아닙니다. 이 클래스는 변경 불가능한 string
을 만드는 데 도움이되는 기능 단위입니다. 당신은 StringBuilder
가 최종 문자열에 수 (논리적으로, 아직 존재하는), 그리고이 완료되면 다음, 내 생각, myStringBuilder.ToString()
을 (를 호출해야하는지 정의하는 다양한 Append
방법을 사용하여 인스턴스화해야 BuildString()
)를 사용하여 원하는 실제 문자열을 가져옵니다.
당신은 [여기] 코드 읽을 수 있습니다 (https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs). 긴 이야기 짧게 : StringBuilder는 char 배열에 의해 뒷받침됩니다. – john
[string이 불변이고 stringbuilder가 변경 가능합니다] 가능한 복제본 (https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –
두 개의 서로 다른 개체입니다. 문자열은 변경할 수 없습니다. StringBuilder가 아닙니다. StringBuilder가 String으로 시작한다는 사실은 필연적으로 변경 불가능하다는 것을 의미하지는 않습니다. :) – user1506104