StringWriter 또는 StringBuilder
의 차이점은 무엇 StringWriter
과 StringBuilder
나는 둘 중 하나를 사용해야 할 때?
나는 기존 답변 중 어떤 것도 실제로 질문에 답하지 않는다고 생각합니다. 두 클래스 간의 실제 관계 는 어댑터 패턴 의 예입니다 .
StringWriter
필드에 저장 Write...
하는 인스턴스로 전달하여 모든 메서드를 구현 StringBuilder
합니다. 내부 문자열 작성기를 반환 StringWriter
하는 공용 메서드 GetStringBuilder 와 기존 .NET Framework 를 전달할 수 있는 생성자 가 있기 때문에 이것은 단순한 내부 세부 정보가 아닙니다 StringBuilder
.
.NET Framework에서 작동 할 것으로 예상되는 코드에서 대상으로 사용할 StringWriter
수있는 어댑터도 마찬가지 입니다 . 기본 동작 측면에서 분명히 선택할 수있는 것은 없습니다. 통화 전달의 오버 헤드를 측정 할 수 없다면 약간 느리지 만 그다지 중요하지 않은 것 같습니다.StringBuilder
TextWriter
StringWriter
그렇다면 왜 그들은 직접 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
'Nice programing' 카테고리의 다른 글
kubectl 로그-연속 (0) | 2020.11.23 |
---|---|
HTTP 요청에서 urllib2로 사용자 정의 헤더를 보내려면 어떻게해야합니까? (0) | 2020.11.23 |
쉼표로 구분 된 목록에 대한 정규식 (0) | 2020.11.23 |
Objective-C에서 respondsToSelector를 사용하는 경우 (0) | 2020.11.23 |
F #에서 '인라인'사용 (0) | 2020.11.23 |