la meilleure façon d'effacer le contenu de .NET StringBuilder
Je voudrais vous demander ce que vous pensez est le meilleur moyen (dure moins /consomme moins de ressources) pour effacer le contenu afin de le réutiliser un StringBuilder. Imaginez le scénario suivant:
StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
sb.Append("{0}", whatever);
}
//Perform some stuff with sb
//Clear stringbuilder here
//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
sb.Append("{0}", whatever2);
}
Et quand compensation StringBuilder je pense à deux possibilités:
sb = new StringBuilder();
ou
sb.Length = 0;
Quel est le meilleur moyen de l'effacer, et pourquoi?
Merci.
EDIT: je ment avec de l'actuel .NET version 3.5.
- Pas une réponse, mais intéressant à lire: bobondevelopment.com/2007/06/11/...
- Quelle est la raison de ne pas y compris le StringBuilder.Méthode Clear() comme une alternative?
- c# 4.0 n'est pas encore sorti, c'est seulement dans la version 4.0. Sur MSDN, il dit: pris en charge dans: 4.
- heureusement pour moi que c#4.0 est sorti blogs.msdn.com/somasegar/default.aspx
- Je me demande pourquoi
Length
est accessible en écriture, mais il n'y a pas de lecture/écriture propriété "Text"? En disantsb.Text = "";
semble plus claire quesb.Length = 0;
, et unText
bien pourrait aussi aider dans le scénario où l'on aurait autrement-à-diresb.Length = 0; sb.Append(StuffToStartWith);
. - Probablement parce que
.Text
propriété encourage les gens à accidentellement l'écrituresb.Text = sb.Text + nextString;
, en battant le point de l'ensemble de l'aide d'unStringBuilder
en premier lieu. - Il serait raisonnable d'exiger que le code de vouloir définir le contenu d'un
Set
méthode plutôt qu'une propriété, mais si l'on a pris une telle approche, je ne vois pas de raisonLength
ne devraient pas être traitées de manière adéquate, surtout depuis qu'il y aurait peut être utilise pour les différentes façons de traiter l'allongement et le raccourcissement des scénarios.
Vous devez vous connecter pour publier un commentaire.
Si vous ne le faites pas dans .NET 2.0 ou 3.5, écrire une méthode d'extension pour faire comme ceci:
Ensuite, vous pouvez l'effacer comme ceci:
Puis, quand 4.0 vient de sortir, vous pouvez troquer votre méthode d'extension en faveur de la version 4.0.
Mise à JOUR: Ce n'est probablement pas une bonne idée de la Capacité de zéro. Qui va garantir les réaffectations lorsque vous ajoutez à la bâtisseur, si vous êtes à la réutilisation de la même instance. Toutefois, la mémoire de l'instance du constructeur n'est pas libéré jusqu'à ce que vous définissez la Capacité à une valeur très faible (1). La valeur par défaut de la propriété de Capacité est de 16 ans. Vous pouvez envisager d'utiliser 16, ou (si c'est moins efficace) réglage de la capacité deux fois:
StringBuilder
est connu pour avoir tenu quelque chose de anormalement big. Surtout dans les versions antérieures de .net, si l'on veut être à plusieurs reprises la construction des chaînes de plus de 42 500 caractères, la compensation de la mémoire tampon après chaque chaîne de causer des objets supplémentaires allouées dans le Tas d'Objets Volumineux à chaque fois que le tampon est à re-pousser. C'est une Mauvaise Chose.Dans .NET 4.0, vous pouvez appeler
sb.Clear()
mais en version plus ancienne, vous devez définirsb.Length = 0
.La
Clear()
méthode a été ajouté dans .NET 4.0.Créer la nouvelle StringBuilder. L'ancien maintient ressources associées (tampon de longueur maximale, par exemple) qui sont les mieux juste les ordures collectées à l'écart.
Je pense que vous faites l'optimisation prématurée.
Je serais prêt à parier que faire
sb.Length=0;
serait le plus rapide pour éviter de créer un autre objet et placer un autre objet de côté pour le GC, éventuellement, de les collecter.Je pense que la création d'une nouvelle StringBuilder serait le meilleur coup pour soucis de mémoire. et le réglage de
sb.Length
serait le meilleur coup pour la vitesse préoccupations..De Contenu de la Communauté sur MSDN:
Dans .NET Framework 4 nouvelles méthodes ont été introduites dans
StringBuilder
classe. Nom de la méthode est "Clair". Cette méthode vous permet de désactiver ou de supprimer des valeurs ou des données à partir deStringBuilder
objets.Ici est un exemple pour cela.
Si vous êtes à la recherche pour réduire l'utilisation de la mémoire je voudrais utiliser le CLR Profiler pour vérifier la quantité de mémoire de votre StringBuilder objets à l'aide par le biais de leur cycle de vie en utilisant les méthodes d'autres ont décrit ci-dessus. Ensuite, vous pouvez vous assurer que l'option que vous choisissez est adapté à vos besoins et libère les ressources dont vous avez besoin.
Je dirais que le meilleur moyen de l'effacer, il est à utiliser
sb = new StringBuilder();
. Cela étant dit, je pense que ce serait encore mieux si vous faites un nouveau générateur de chaîne d'objet tout à fait.MODIFIER
J'espère qu'il va sans dire que c'est la meilleure solution.
StringBuilder
.Appelez simplement Clear() méthode de réglage de la longueur = 0 ,
Nous pouvons mettre en Capacité = 0 aussi, si nous voulons économiser de la mémoire
Ref: Dans referencesource.microsoft.com
C# En Bref Pour effacer le contenu d'un
StringBuilder
, il y a deux façons:Length
à zéro: