.net 의 StringBuilder 와 TextWriter 의 차이 에 대한 상세 한 설명

최근 한가 한 시간 에 개 원 된 라 이브 러 리 를 보 았 습 니 다.일부 라 이브 러 리 는 TextWriter 류 로 관련 문자열 데 이 터 를 기록 하 는 것 을 좋아 하 는 것 을 보고 궁금 합 니 다.왜 StringBuilder 류 대상 을 사용 하지 않 는 지 궁금 합 니 다.그래서 인터넷 에서 한 번 검색 해 관련 노트 를 정리 했다.
StringBuilder 클래스
.net 에서 문자열 은 기본 적 인 데이터 형식 으로 한 프로그램 에서 같은 문자열 은 하나의 복사 본 만 유지 합 니 다.문자열 값 을 직접 지정 한 문자열 인용 을 통 해 같은 데이터 에 인 용 될 수 있다 는 것 이다.이러한 처리 의 장점 은 문자열 이 사용 하 는 메모리 공간 을 줄 일 수 있 고 같은 문자열 에 여러 번 공간 을 열 필요 가 없다 는 것 이다.C\#에서 string 형식 은 변 하지 않 습 니 다.문자열 참조 에 새 값 을 부여 하 는 것 은 메모리 에 있 는 데 이 터 를 바 꾸 지 않 고 새 문자열 로 인 용 된 위 치 를 설정 합 니 다.
평소에 이러한 처리 논 리 는 문자열 이 사용 하 는 메모리 공간 을 크게 줄 일 수 있 지만 가끔 은 역 효 과 를 낼 수 있다.전형 적 인 예 는 일부 구조 문자열 이 작 동 할 때 생 성 된 중간 문자열 데이터 이다.예 를 들 어:

string[] words = {"Nice ", "to ", "meet ", "you."};
string sentence = "";
for(i = 0;i < words.Length; i++)
{
  sentence += words[i];
}
이것 은 아주 간단 한 문자열 조립 기능 입 니 다.주어진 단 어 를 하나의 문장 으로 연결 합 니 다.우 리 는 마지막 결과 로 직접 연결 하 기 를 원 합 니 다.그러나 이 코드 는 최종 문장 을 만 드 는 것 을 제외 하고 이전의 임시 도 생 성 됩 니 다.즉,'Nice','Nice to','Nice to meet',마지막 문자열 인'Nice to meet you.'는 한 번 의 순환 에 따라 모두 구 조 될 것 이다.그러나 사실 우리 에 게 는 마지막 문장 만 있 으 면 되 고 중간 부분 은 전혀 필요 없다.이 를 위해,우 리 는 무의미 한 지출 을 피하 기 위해 새로운 방식 이 필요 하 다.
StringBuilder 클래스 는 문자열 을 동적 으로 유연 하 게 구성 하 는 방법 입 니 다.이러한 구조 문자열 의 장점 은 구조 중간 문자열 결 과 를 피하 고 최종 문자열 데 이 터 를 직접 생 성 할 수 있다 는 것 이다.위의 예 에 따 르 면 조금 만 수정 하면 성능 이 더욱 우수한 버 전 을 얻 을 수 있 으 며,이 버 전에 서 는 마지막 문장 문자열 만 생 성 된다.

string[] words = {"Nice ", "to ", "meet ", "you."};
StringBuilder sentenceBuilder = new StringBuilder();
for(i = 0;i < words.Length; i++)
{
  sentenceBuilder.Append(words[i]);
}
string setence = sentenceBuilder.ToString();
StringBuilder 클래스 의 원리 에 대해 저 는 개인 적 으로 이 클래스 에서 char 형 목록 을 유지 한 다음 에 배열 요 소 를 동적 으로 수정 하여 연결 할 때마다 문자열 을 만 들 지 않 는 목적 을 달성 하고 명시 적 호출 명령 이 생 성 될 때 만 생 성 될 것 이 라 고 추측 합 니 다.하지만 능력 에 한계 가 있 기 때문에 runtime 이라는 오픈 소스 라 이브 러 리 에서 StringBuilder 의 실현 을 어떻게 찾 는 지 모 르 겠 습 니 다.
TextWriter 클래스
TextWriter 는 마이크로소프트 가 공식 적 으로 설명 한 것 에 따라 질서 있 는 문자 시 리 즈 를 만 들 수 있 는 추상 적 인 클래스 입 니 다.응,글 자 는 다 알 지만 이 말 은 사람 이 하 는 말 같 지 않 아.사실 나 는 개인 적 으로 이런 종류의 이 해 는 그것 이 기록 기 라 는 것 이다.다시 말 하면 TextWriter 는 기록 하 는 과정 을 묘 사 했 지만 구체 적 으로 무엇 을 썼 습 니까?어디 에 쓰 시 겠 습 니까?이것 은 이 추상 류 가 관심 을 가 지 는 화제 가 아니 라 그 부류 가 책임 진다.
.net 에서 자주 내 장 된 하위 클래스:
4.567917.StreamWriter:이런 종 류 는 많은 사람들 이 잘 알 고 있다 고 믿 습 니 다.파일 에 데 이 터 를 기록 해 야 할 때 이런 종 류 를 통 해 데 이 터 를 기록 합 니 다4.567917.StringWriter:오늘 본 고 에서 연구 해 야 할 대상 을 문자열 에 기록 합 니 다.4.567918.
HttpWriter:네트워크 흐름 에 데 이 터 를 기록 합 니 다StringWriter 클래스 는 TextWriter 의 계승 클래스 입 니 다.MSDN 에 따 르 면 정 보 를 문자열 에 기록 하 는 TextWriter 클래스 의 대상 입 니 다.이 클래스 는 StringBuilder 클래스 와 기능 차이 가 많 지 않 습 니 다.그런데 왜.net 에서 두 개의 서로 다른 기능 을 같은 기능 으로 디자인 합 니까?관련 자 료 를 뒤 져 보 니 이 두 가지 유형 은 서로 다른 디자인 사고방식 에서 나 온 결과 물이 라 고 할 수 밖 에 없다.StringBuilder 는 유연 하 게 문자열 을 구축 하 는 클래스 입 니 다.추가 적 인 임시 문자열 이 생기 지 않 고 StringWriter 는 문자열 데 이 터 를 기록 하 는 목적지 로 사용 합 니 다.이런 측면 에서 볼 때 필요 한 실현 입 니 다.
예 를 들 어 문자열 데 이 터 를 기록 하 는 함수 가 있 습 니 다.구체 적 으로 로그 기록 기 가 로그 정 보 를 어디 에 기록 하 는 것 으로 상상 할 수 있 습 니 다.이러한 상황 에서 저 희 는 두 개의 입력 인 자 를 제공 합 니 다.TextWriter 류 대상 은 하나의 기록 기 임 을 나타 내 고 message 는 로그 정 보 를 설명 합 니 다.그러면 데 이 터 를 기록 하려 면 이렇게 쓰 면 됩 니 다.

public void WriteData(TextWriter writer, string message)
{
  writer.Write(message);
}
이렇게 되면 정 보 를 어떤 파일 에 기록 하면 이렇게 쓰 면 됩 니 다.

using var file = new FileStream("./log.txt", FileAccess.Write);
using var writer = new StreamWriter(file);
WriteData(writer, "hello");
어떤 변수 에 정 보 를 기록 하려 면 다음 과 같 습 니 다.

var writer = new StringBuilder();
WriteData(writer, "hello");
data = writer.ToString();
총결산
전체적으로 문자열 값 을 수정 하지 않 고 문자열 만 사용 할 때 string 형식 을 직접 사용 하면 됩 니 다.어떤 문자열 데 이 터 를 만 드 는 데 더 집중 하 는 것 이 필요 하 다 면 StringBuilder 를 사용 하 는 것 이 좋 습 니 다.특정한 형식의 문자열 데 이 터 를 특정한 미디어 에 기록 하 는 것 을 강조 한다 면 TextWriter 에 대응 하 는 계승 류 를 사용 하 는 것 이 좋 고 패 키 징 사상 에 부합 되 며 데이터 가 어떻게 쓰 이 는 지 에 너무 관심 을 가지 지 않 아 도 됩 니 다.기록 해 야 할 데 이 터 를 전송 하면 됩 니 다.
.net 의 StringBuilder 와 TextWriter 의 차이 점 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 관련.net StringBuilder TextWriter 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기