web-dev-qa-db-fra.com

Alternatives à "" pour la création de chaînes contenant plusieurs caractères d'espacement

Je me demande s’il existe un moyen plus OO de créer des espaces en C #.

Littéralement Space Code!

J'ai actuellement tabs += new String(" "); et je ne peux pas m'empêcher de penser que cela rappelle un peu l'utilisation de "" au lieu de String.Empty.

Que puis-je utiliser pour créer des espaces qui ne sont pas " "?

22
Jamie Dixon

Tu peux écrire

" "

au lieu de

new String(' ')

Est ce que ça aide?


Selon ce que vous faites, vous voudrez peut-être examiner la surcharge StringBuilder.Append acceptant un caractère et un nombre de répétitions:

var tabs = new StringBuilder();
tabs.Append(' ', 8);

ou dans la stringconstructor qui construit une chaîne à partir d'un caractère ayant un nombre de répétitions:

var tabs = new string(' ', 8);

Voici une solution d'entreprise OO pour répondre à tous vos besoins en matière de génération d'espace:

public abstract class SpaceFactory
{
    public static readonly SpaceFactory Space = new SpaceFactoryImpl();

    public static readonly SpaceFactory ZeroWidth = new ZeroWidthFactoryImpl();

    protected SpaceFactory { }

    public abstract char GetSpace();

    public virtual string GetSpaces(int count)
    {
        return new string(this.GetSpace(), count);
    }

    private class SpaceFactoryImpl : SpaceFactory
    {
        public override char GetSpace()
        {
            return '\u0020';
        }
    }

    private class ZeroWidthFactoryImpl : SpaceFactory
    {
        public override char GetSpace()
        {
            return '\u200B';
        }
    }
}
42
dtb

Maintenant que vous avez clarifié vos commentaires:

Dans mon code actuel je fais nouveau String ('', numberOfSpaces) donc je probablement besoin de continuer à utiliser le nouveau Partie de chaîne.

... les autres réponses jusqu'à présent sont effectivement inutiles :(

Vous pourriez écrire:

const char Space = ' ';

puis utiliser

new string(Space, numberOfSpaces)

mais je ne vois aucun avantage de cela sur

new string(' ', numberOfSpaces)
14
Jon Skeet

si le nombre d'espaces change, vous pouvez faire quelque chose comme ceci:

public static string Space(int count)
{
    return "".PadLeft(count);
}

Space(2);
8
TStamper

Il n'y a aucune raison de faire cela. Toutes choses étant égales par ailleurs, un code plus petit correspond à un meilleur code . String.Empty et new String(' ') communiquent la même chose que "" et " ", ils ont juste besoin de plus de caractères pour le faire.

Essayer de le rendre plus OO ajoute simplement des caractères sans aucun avantage. L'orientation objet n'est pas une fin en soi.

5
Gabe Moothart

En fonction de la prévalence dans votre code, la méthode StringBuilder peut être meilleure.

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

Vous pouvez aussi mélanger la constante ...

StringBuilder tabs = new StringBuilder();
const string SPACE = " ";
...

tabs.Append(SPACE);
3
Austin Salonen

Étendre la chaîne pour vous donner une méthode pour ajouter de l'espace

public static string AddSpace(this String text, int size)
{
   return text + new string(' ', size)
}

Horrible dans son propre droit cependant.

3
Mark Dickinson

Le moyen le plus efficace consiste à trouver un moyen plus simple de résoudre le problème de votre entreprise. Par exemple, le fait que vous ayez une variable nommée tabs m'indique que vous essayez de lancer votre propre code d'alignement de colonne. String.Format le supporte directement, par exemple.

// Left-align name and status, right-align amount (formatted as currency).
writer.WriteLine("Name                 Status         Amount");
writer.WriteLine("-------------------- ---------- ----------");
foreach(var item in items) {
    writer.WriteLine(string.Format("{0,-20} {1,-10} {2,10:C}", item.Name, item.Status, item.Amount));
}
2
Christian Hayter

Si la langue le permettait, vous pourriez ajouter une propriété d'extension au type String qui était Space, quelque chose comme:

public static class StringExt
{
    public static char Space(this String s)
    {
        get {
            return ' ';
        }
    }
}

mais ce n'est pas possible. Je pense qu'il serait préférable de garder l'espace à l'intérieur de la propriété si c'était un objet localisable, mais je pense que les espaces sont universels dans toutes les langues.

1
avid

Je pense que vous emmenez OO trop loin. Un simple ajout d'espace ne nécessite pas une classe entière.

tabs += new String(' ');

ou 

tabs += " ";

est très bien.

1
corymathews

Vous pouvez créer des extensions de classe.

public static class StringExtensions
    {
        public static string GetSpace(this String)
        {
           return " ";
        }
    }

et vous pouvez appeler ça.

String.GetSPace();

StringBuilder.Insert et StringBuilder.Append vous permettent de créer des espaces numériques, par exemple. sb.Insert (0, "", 20) insérera 20 espaces au début de votre objet sb (StringBuilder).

0
IsolatedStorage

Je pense que vous pourriez utiliser "\t" pour vous donner un caractère de tabulation. Cela pourrait rendre l'espace plus clair.

0
Matt Ellen