Альтернативы "" для создания строк, содержащих несколько пробельных символов - PullRequest
23 голосов
/ 11 ноября 2009

Мне интересно, есть ли еще ОО способ создания пробелов в C #.

Буквально космический код!

В настоящее время у меня есть tabs += new String(" ");, и я не могу не чувствовать, что это несколько напоминает использование "" вместо String.Empty.

Что я могу использовать для создания пробелов, которые не " "?

Ответы [ 12 ]

43 голосов
/ 11 ноября 2009

Вы можете написать

" "

вместо

new String(' ')

Это помогает?


В зависимости от того, что вы делаете, вы можете посмотреть на перегрузку StringBuilder.Append , которая принимает символ и счетчик повторений:

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

или в конструктор string , который создает строку из символа с числом повторений:

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

Вот корпоративное OO-решение для удовлетворения всех ваших потребностей в генерации пространства:

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';
        }
    }
}
15 голосов
/ 11 ноября 2009

Теперь, когда вы уточнили в комментариях:

В моем собственном коде я делаю новый Строка ('', numberOfSpaces), поэтому я наверное надо еще использовать новый Струнная часть.

... другие ответы до сих пор практически бесполезны: (

Вы могли бы написать:

const char Space = ' ';

затем используйте

new string(Space, numberOfSpaces)

но я не вижу в этом никакой пользы по сравнению с

new string(' ', numberOfSpaces)
8 голосов
/ 11 ноября 2009

если количество пробелов будет меняться, вы можете сделать что-то вроде этого:

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

Space(2);
5 голосов
/ 11 ноября 2009

Нет причин делать это. При прочих равных, меньший код лучше кода . String.Empty и new String(' ') сообщают то же самое, что и "" и " ", им просто требуется больше символов для этого.

Попытка сделать его «более OO» просто добавляет символы без пользы. Объектная ориентация не является самоцелью.

3 голосов
/ 11 ноября 2009

Расширьте строку, чтобы дать вам метод для добавления пробела

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

Ужасно само по себе, хотя.

3 голосов
/ 11 ноября 2009

В зависимости от того, насколько распространено это в вашем коде, способ StringBuilder может быть лучше.

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

Вы можете смешивать в константе тоже ...

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

tabs.Append(SPACE);
2 голосов
/ 11 ноября 2009

Более "ОО" способ будет найти более простой способ решения вашей более крупной бизнес-задачи. Например, тот факт, что у вас есть переменная с именем tabs, подсказывает мне, что вы пытаетесь свернуть свой собственный код выравнивания столбцов. String.Format поддерживает это напрямую, например,

// 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));
}
1 голос
/ 11 ноября 2009

Я думаю, вы далеко ушли. Простое добавление пробела не требует целого класса.

tabs += new String(' ');

или

tabs += " ";

просто отлично.

1 голос
/ 11 ноября 2009

Если язык допускает это, вы можете добавить свойство расширения к типу String, которое было Space, что-то вроде:

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

но это невозможно. Я думаю, что было бы лучше оставить пространство внутри свойства, если бы оно было локализуемым, но я думаю, что пространства универсальны для всех языков.

0 голосов
/ 26 сентября 2018

Вы можете создавать расширения класса.

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

, и вы можете назвать это.

String.GetSPace();
...