Nice programing

StringWriter 또는 StringBuilder

nicepro 2020. 11. 23. 19:59
반응형

StringWriter 또는 StringBuilder


의 차이점은 무엇 StringWriterStringBuilder나는 둘 중 하나를 사용해야 할 때?


나는 기존 답변 중 어떤 것도 실제로 질문에 답하지 않는다고 생각합니다. 두 클래스 간의 실제 관계 는 어댑터 패턴 의 예입니다 .

StringWriter필드에 저장 Write...하는 인스턴스로 전달하여 모든 메서드를 구현 StringBuilder합니다. 내부 문자열 작성기를 반환 StringWriter하는 공용 메서드 GetStringBuilder기존 .NET Framework 를 전달할 수 있는 생성자있기 때문에 이것은 단순한 내부 세부 정보가 아닙니다 StringBuilder.

.NET Framework에서 작동 할 것으로 예상되는 코드에서 대상으로 사용할 StringWriter수있는 어댑터도 마찬가지 입니다 . 기본 동작 측면에서 분명히 선택할 수있는 것은 없습니다. 통화 전달의 오버 헤드를 측정 할 수 없다면 약간 느리지 만 그다지 중요하지 않은 것 같습니다.StringBuilderTextWriterStringWriter

그렇다면 왜 그들은 직접 StringBuilder구현 하지 않았 TextWriter습니까? 인터페이스의 의도가 언뜻보기에 항상 명확하지 않기 때문에 이것은 회색 영역입니다.

TextWriter이다 매우 거의 문자의 스트림을 받아 뭔가에 대한 인터페이스는. 그러나 여기에는 Encoding 이라는 속성이라는 추가 주름이 있습니다 . 이것은 TextWriter문자 스트림을 받아들이고 이를 바이트로 변환 하는 인터페이스 라는 것을 의미합니다 .

이것은 StringWriter인코딩을 수행하지 않기 때문에 쓸모없는 흔적입니다 . 문서는 말합니다 :

이 속성은 StringWriter에서 사용하는 인코딩을 포함하는 헤더를 작성해야하는 일부 XML 시나리오에 필요합니다. 이렇게하면 XML 코드가 임의의 StringWriter를 사용하고 올바른 XML 헤더를 생성 할 수 있습니다.

우리의 값을 지정할 수있는 방법이 없기 때문에 그러나 그것은 바로 수 없습니다 Encoding에 대한이 StringWriter. 속성에는 항상 값이 UnicodeEncoding있습니다. 따라서 XML 헤더를 빌드하기 위해이 속성을 검사 한 코드는 항상 utf-16. 예를 들면 :

var stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
    xDocument.WriteTo(xmlWriter);

그러면 헤더가 생성됩니다.

<?xml version="1.0" encoding="utf-16"?>

File.WriteAllText사용 하여 XML 문자열을 파일에 쓴 다면 어떻게 될까요? 기본적 utf-8으로 utf-16헤더 가있는 파일 을 갖게 됩니다 .

이러한 시나리오에서는 사용하는 것이 안전 할 것이다 StreamWriter, 파일 경로로를 구성하거나 FileStream, 또는 데이터를 검사하려면 다음을 사용 MemoryStream그래서 바이트의 배열을 얻을 . 이러한 모든 조합 바이트 인코딩 및 헤더 생성이 동일한에 의해 인도되고되었는지 확인 할 Encoding당신의 가치 StreamWriter.

Encoding속성 의 목적은 문자 스트림 생성자가 인코딩에 대한 정확한 정보를 문자 스트림 자체에 포함 할 수 있도록하는 것이 었습니다 (예 : XML 예제, 다른 예제에는 이메일 헤더 등).

그러나을 도입 StringWriter하면 콘텐츠 생성과 인코딩 간의 연결이 끊어져 이러한 자동 메커니즘이 작동을 멈추고 잠재적으로 오류가 발생하기 쉽습니다.

그럼에도 불구하고은 ( StringWriter는)주의하면 유용한 어댑터입니다. 즉, 콘텐츠 생성 코드가 Encoding속성 의 무의미한 가치에 의존해서는 안된다는 것을 이해합니다 . 그러나 이러한 종류의 경고는 일반적으로 어댑터 패턴과 관련이 있습니다. 사각형 같지만 거의 둥근 말뚝을 둥근 구멍에 넣을 수있는 일종의 해킹입니다.


StringWriter에서 파생되어 TextWriter다양한 클래스가 텍스트가 어디로 가는지 신경 쓰지 않고 텍스트를 작성할 수 있습니다. 의 경우 StringWriter출력은 메모리에 저장됩니다. a가 필요한 API를 호출하고 TextWriter있지만 메모리에 결과 만 쌓고 싶을 때 이것을 사용합니다 .

StringBuilder기본적으로 매번 새로운 문자열 객체를 만들지 않고도 "논리 문자열"에 여러 작업 (일반적으로 추가)을 수행 할 수있는 버퍼입니다. 이것을 사용하여 여러 작업에서 문자열을 구성합니다.


이전의 (좋은) 답변을 바탕으로 StringWriter는 실제로 StringBuilder보다 훨씬 더 다양하여 많은 오버로드를 제공합니다.

예를 들면 :

Stringbuilder는 Appendline에 대해 문자열 만 허용하거나 아무것도 허용하지 않습니다.

StringBuilder sb = new StringBuilder();
sb.AppendLine("A string");

StringWriter는 문자열 형식을 직접 취할 수 있습니다.

StringWriter sw = new StringWriter();
sw.WriteLine("A formatted string {0}", DateTime.Now);

StringBuilder를 사용하면이를 수행해야합니다 (또는 string.Format 또는 $ ""사용).

sb.AppendFormat("A formatted string {0}", DateTime.Now);
sb.AppendLine();

일을하거나 죽지 않지만 여전히 차이


StringBuilder클래스는 기본적으로 변경 가능한 문자열로 헬퍼 클래스 구성 불변의 문자열입니다. StringWriter문자열 형식에 대한 더 많은 편의 기능을 추가하기 위해 상단에 내장되어 있습니다.


A StringWriter는 텍스트를 쓰는 데 사용됩니다.파일memory와 a StringBuilder는 메모리 효율적인 방식으로 문자열을 함께 추가 하는 데 사용됩니다.


StringBuilder그리고 StringReader서로 다른 상황에서 성능을 향상하는 데 사용됩니다. 연결, 문자열 반복 수정과 같은 문자열 조작 성능을 향상시키는 데
사용 StringBuilder 합니다.

Random rnd = new Random();
StringBuilder sb = new StringBuilder();

// Generate 10 random numbers and store in sb.
for (int i = 0; i < 10; i++)
{
    sb.Append(rnd.Next().ToString("N5"));
}
Console.WriteLine("The original string:");
Console.WriteLine(sb.ToString());

// Decrease each number by one.
for (int ctr = 0; ctr < sb.Length; ctr++)
{
    if (Char.GetUnicodeCategory(sb[ctr]) == System.Globalization.UnicodeCategory.DecimalDigitNumber)
    {
        int number = (int)Char.GetNumericValue(sb[ctr]);
        number--;
        if (number < 0)
            number = 9;

        sb[ctr] = number.ToString()[0];
    }
}
Console.WriteLine("\nThe new string:");
Console.WriteLine(sb.ToString());

사용하여 StringReader 별도의 라인에서 많은 양의 텍스트를 분석하고 데이터를 처리하는 동안 메모리 사용을 최소화하기 위해. StringReader의 ReadLine 메서드가 현재 위치에서 시작하는 다음 줄 바꿈을 검색 한 다음 필드 문자열을 기반으로 sbstring을 반환하는 다음 예제를 참조하십시오.

using (StringReader sr = new StringReader("input.txt"))
{
    // Loop over the lines in the string or txt file.
    int count = 0;
    string line;
    while((line = sr.ReadLine()) != null)
    {
        count++;
        Console.WriteLine("Line {0}: {1}", count, line);
    }
}

StringBuilder대량 문자열 연결에 사용됩니다. 내가 아는 한, 5 개 이상의 문자열에 더 효과적입니다 String.Concat(). 또한 특정 형식 ( .AppendFormat()) 과 함께 사용할 수 있습니다.

참고URL : https://stackoverflow.com/questions/602279/stringwriter-or-stringbuilder

반응형