StringBuilder Vs StringWriter/StringReader

j'ai lu récemment, dans StringWriter et StringReader sont utilisés pour l'écriture et la lecture de StringBuilder.

Bien lorsque j'utilise StringBuilder Objet, il semble être une auto de la classe suffisants.

nous avons toutes les façons de lire et d'écrire le StringBuilder, à l'aide StringBuilder.Append(),Insert(),Replace(),Remove() etc...

  1. Quelle est l'utilisation possible de StringWriter et StringReader, qui ne peut pas être fait par <!-- Elle-même?
  2. Quelle est l'utilisation pratique de ?
  3. quelle pourrait être la raison pour laquelle ils n'acceptent pas Stream comme entrée (parce que n'importe quel autre écrivain et lecteur prend le stream comme paramètre de constructeur pour l'utiliser) mais le StringBuilder?
28
demandé sur Pragmateek 2010-08-03 04:26:22

4 réponses

Quelle est l'utilisation possible de StringWriter et StringReader, qui ne peut pas être fait par StringBuilder lui-même?

StringReader et StringWriter tirer TextReader et TextWriter respectivement. Donc, ce qu'ils peuvent faire agir comme un TextReader ou TextWriter exemple string ou StringBuilder ne peuvent pas parce qu'ils ne dérivent pas l'un ou l'autre de ces types.

Quelle est leur utilité pratique?

ils vous permettent d'appeler APIs que attendez un TextReader ou TextWriter, quand ce que vous voulez est un string ou StringBuilder.

quelle pourrait être la raison pour laquelle ils ne prennent pas Stream comme entrée (parce que n'importe quel autre écrivain et lecteur prend le stream comme paramètre de constructeur pour fonctionner) mais le StringBuilder?

Parce qu'ils ne fonctionnent pas sur les cours d'eau; ils travaillent sur stringou StringBuilder S. Ce sont de simples classes d'emballage qui adaptent ces types aux API. on attend une autre interface. Voir: dessin d'adaptateur.

32
répondu Greg Beech 2010-08-03 00:38:10

D'autres l'ont déjà dit, mais c'est parce qu'ils dérivent de TextReader/TextWriter et peuvent être utilisés à leur place. Pour une chose, c'est tout simplement plus de sens d'utiliser la même méthode pour la sortie des lignes que vous utilisez pour un fichier si vous voulez seulement le contenu d'une chaîne. Si vous voulez une sortie qui va s'étendre sur plusieurs lignes en mémoire, pourquoi se rappeler de mettre "\r\n " à la fin de chaque ligne avec un StringBuilder? Que faire si vous voulez que le code s'exécute ou formater des données pour un système qui utilise "\n" pour les sauts de ligne?

StringBuilder sb = new StringBuilder();
// will be invalid on systems that only use \n
sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss} - Start\r\n", DateTime.Now);
// still have to add an extra parameter
sb.AppendFormat("The current time is {0:yyyy-MM-dd HH:mm:ss}{1}", DateTime.Now,
    Environment.NewLine);

StringWriter sw = new StringWriter();
// Don't have to worry about it, method name tells you there's a line break
sw.WriteLine("{0:yyyy-MM-dd HH:mm:ss} - Start", DateTime.Now);
// no extra parameters
sw.WriteLine("The current time is {0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);

si vous voulez traiter un fichier ligne par ligne, vous utiliserez probablement un StreamReader au lieu de charger l'ensemble du fichier dans un compilateur String et de le diviser par les caractères newline dans un tableau, n'est-ce pas? Avec StringReader vous pouvez utiliser la même méthode exacte (tant qu'il faut un lecteur de texte générique) en créant le lecteur de texte à partir d'une chaîne de caractères à partir d'une boîte de texte ou d'un formulaire web.

Linq2Sql DataContexts ont une propriété Log que vous pouvez définir à TextWriter pour avoir la sortie de vos requêtes avant qu'elles ne soient exécutées pour voir exactement ce qui est exécuté. Vous pouvez définir ceci à un TextWriter attaché à un fichier, mais vous pouvez attacher un rédacteur de chaîne à lui et la sortie du contenu au bas de votre page web lors de l'essai...

5
répondu Jason Goemaat 2010-11-30 04:57:48

Je ne suis pas sûr qui vous a dit que leur but était d'utiliser StringBuilder, mais c'est absolument incorrect. Comme vous l'avez remarqué StringBuilder peuvent être lus et écrits sans l'utilisation d'une autre classe. Les classes StringWriter et StringReader étendent les classes de base TextReader et TextWriter .net Framework et fournissent des fonctionnalités en flux pour travailler avec des données textuelles. Par exemple, si vous avez besoin de travailler avec certaines classes de type XmlDocument, certaines méthodes vous permettent de charger les données Xml via un lecteur de texte, donc si vous avez le texte Xml comme variable de chaîne de caractères, vous pouvez le charger dans un lecteur de chaîne de caractères et ensuite le fournir au XmlDocument.

1
répondu EchoCoder 2010-08-03 00:35:38

vous pouvez utiliser StringReader pour lire tous les entiers d'une chaîne.

private static void Main()
{
    var str = @"
                13
                13
                0 6
                0 5
                0 1
                0 2
                5 3
                6 4
                5 4
                3 4
                7 8
                9 10
                11 12
                9 11
                9 12";


    using (StandardInput input = new StandardInput(new StringReader(str)))
    {
        List<int> integers = new List<int>();
        int n;
        while ((n = input.ReadInt32()) != -1)
        {
            integers.Add(n);
        }
    }
}

StandardInput De La Classe:

class StandardInput : IDisposable
{
    private readonly TextReader reader;

    public StandardInput(TextReader reader)
    {
        this.reader = reader;
    }

    public int ReadInt32()
    {
        while (!char.IsDigit((char)reader.Peek()) && reader.Peek() != -1)
        {
            reader.Read();
        }
        var builder = new StringBuilder();
        while (char.IsDigit((char) reader.Peek()))
            builder.Append((char) reader.Read());

        return builder.Length == 0 ? -1 : int.Parse(builder.ToString());
    }

    public double ReadDouble()
    {
        while (!char.IsDigit((char)reader.Peek()) && reader.Peek() != '.'
                                                  && reader.Peek() != -1)
        {
            reader.Read();
        }
        var builder = new StringBuilder();
        if (reader.Peek() == '.')
            builder.Append((char) reader.Read());
        while (char.IsDigit((char)reader.Peek()))
            builder.Append((char)reader.Read());
        if (reader.Peek() == '.' && !builder.ToString().Contains("."))
        {
            builder.Append((char)reader.Read());
            while (char.IsDigit((char)reader.Peek()))
                builder.Append((char)reader.Read());
        }
        return builder.Length == 0 ? -1 : double.Parse(builder.ToString());
    }

    public void Dispose()
    {
        reader.Dispose();
    }
}
1
répondu Raz Megrelidze 2014-09-08 13:35:56