136 lines
5.1 KiB
C#
136 lines
5.1 KiB
C#
// ==++==
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ==--==
|
|
/*============================================================
|
|
**
|
|
** Class: StringWriter
|
|
**
|
|
** Original implementation by Anders Hejlsberg (AndersH)
|
|
**
|
|
** Purpose: For writing text to a string
|
|
**
|
|
** Date: February 21, 2000
|
|
**
|
|
===========================================================*/
|
|
|
|
using System;
|
|
using System.Text;
|
|
|
|
namespace System.IO {
|
|
// This class implements a text writer that writes to a string buffer and allows
|
|
// the resulting sequence of characters to be presented as a string.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter"]/*' />
|
|
public class StringWriter : TextWriter
|
|
{
|
|
private static UnicodeEncoding m_encoding=null;
|
|
|
|
private StringBuilder _sb;
|
|
private bool _isOpen;
|
|
|
|
// Constructs a new StringWriter. A new StringBuilder is automatically
|
|
// created and associated with the new StringWriter.
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.StringWriter"]/*' />
|
|
public StringWriter()
|
|
: this(new StringBuilder()) {
|
|
}
|
|
|
|
// Constructs a new StringWriter that writes to the given StringBuilder.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.StringWriter1"]/*' />
|
|
public StringWriter(StringBuilder sb) {
|
|
if (sb==null)
|
|
throw new ArgumentNullException("sb", "ArgumentNull_Buffer");
|
|
_sb = sb;
|
|
_isOpen = true;
|
|
}
|
|
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Close"]/*' />
|
|
public override void Close()
|
|
{
|
|
Dispose(true);
|
|
}
|
|
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Dispose"]/*' />
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
// Do not destroy _sb, so that we can extract this after we are
|
|
// done writing (similar to MemoryStream's GetBuffer & ToArray methods)
|
|
_isOpen = false;
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Encoding"]/*' />
|
|
public override Encoding Encoding {
|
|
get {
|
|
if (m_encoding==null) {
|
|
m_encoding = new UnicodeEncoding(false, false);
|
|
}
|
|
return m_encoding;
|
|
}
|
|
}
|
|
|
|
// Returns the underlying StringBuilder. This is either the StringBuilder
|
|
// that was passed to the constructor, or the StringBuilder that was
|
|
// automatically created.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.GetStringBuilder"]/*' />
|
|
public virtual StringBuilder GetStringBuilder() {
|
|
return _sb;
|
|
}
|
|
|
|
// Writes a character to the underlying string buffer.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Write"]/*' />
|
|
public override void Write(char value) {
|
|
if (!_isOpen)
|
|
__Error.WriterClosed();
|
|
_sb.Append(value);
|
|
}
|
|
|
|
// Writes a range of a character array to the underlying string buffer.
|
|
// This method will write count characters of data into this
|
|
// StringWriter from the buffer character array starting at position
|
|
// index.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Write1"]/*' />
|
|
public override void Write(char[] buffer, int index, int count) {
|
|
if (!_isOpen)
|
|
__Error.WriterClosed();
|
|
if (buffer==null)
|
|
throw new ArgumentNullException("buffer", "ArgumentNull_Buffer");
|
|
if (index < 0)
|
|
throw new ArgumentOutOfRangeException("index", "ArgumentOutOfRange_NeedNonNegNum");
|
|
if (count < 0)
|
|
throw new ArgumentOutOfRangeException("count", "ArgumentOutOfRange_NeedNonNegNum");
|
|
if (buffer.Length - index < count)
|
|
throw new ArgumentException("Argument_InvalidOffLen");
|
|
|
|
_sb.Append(buffer, index, count);
|
|
}
|
|
|
|
// Writes a string to the underlying string buffer. If the given string is
|
|
// null, nothing is written.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.Write2"]/*' />
|
|
public override void Write(String value) {
|
|
if (!_isOpen)
|
|
__Error.WriterClosed();
|
|
if (value != null) _sb.Append(value);
|
|
}
|
|
|
|
// Returns a string containing the characters written to this TextWriter
|
|
// so far.
|
|
//
|
|
//| <include file='doc\StringWriter.uex' path='docs/doc[@for="StringWriter.ToString"]/*' />
|
|
#if false
|
|
public override string ToString() {
|
|
return _sb.ToString();
|
|
}
|
|
#endif
|
|
}
|
|
}
|