it-roy-ru.com

Альтернативы "" для создания строк, содержащих несколько пробельных символов

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

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

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

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

22
Jamie Dixon

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

" "

вместо

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';
        }
    }
}
42
dtb

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

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

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

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

const char Space = ' ';

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

new string(Space, numberOfSpaces)

но я не вижу никакой пользы от этого

new string(' ', numberOfSpaces)
14
Jon Skeet

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

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

Space(2);
8
TStamper

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

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

5
Gabe Moothart

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

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

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

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

tabs.Append(SPACE);
3
Austin Salonen

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

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

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

3
Mark Dickinson

Более "ОО" способ будет найти более простой способ решения вашей большой бизнес-проблемы. Например, тот факт, что у вас есть переменная с именем 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));
}
2
Christian Hayter

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

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

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

1
avid

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

tabs += new String(' ');

или же 

tabs += " ";

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

1
corymathews

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

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

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

String.GetSPace();
0
John Paul Juanillo Rabanal

StringBuilder.Insert и StringBuilder.Append позволяют создавать любые числовые пространства, например, sb.Insert (0, "", 20) вставит 20 пробелов в начало вашего объекта sb (StringBuilder).

0
IsolatedStorage

Я думаю, вы могли бы использовать "\t", чтобы дать вам символ табуляции. Это может сделать пространство более ясным.

0
Matt Ellen