开发者

Alternatives to " " for creating strings containing multiple whitespace characters

I'm wondering if there's a more OO way of creating spaces in C#.

Literally Space Code!

I currently have tabs += new String(" "); and I can't help but feel that this is somewhat reminiscent of using "" instead of String.Empty.

开发者_如何学C

What can I use to create spaces that isn't " "?


You can write

" "

instead of

new String(' ')

Does that help?


Depending on what you do, you might want to look into the StringBuilder.Append overload that accepts a character and a 'repeat' count:

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

or into the string constructor that constructs a string from a character a 'repeat' count:

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

Here's an enterprisey OO solution to satisfy all your space generation needs:

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


Now that you've clarified in comments:

In my actual code I'm doing new String(' ',numberOfSpaces) so I probably need to still use the new String part.

... the other answers so far are effectively useless :(

You could write:

const char Space = ' ';

then use

new string(Space, numberOfSpaces)

but I don't see any benefit of that over

new string(' ', numberOfSpaces)


if the number of spaces would be changing then you could do something like this:

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

Space(2);


There is no reason to do this. All else being equal, smaller code is better code. String.Empty and new String(' ') communicate the same thing as "" and " ", they just take more characters to do it.

Trying to make it 'more OO' just adds characters for no benefit. Object-Orientation is not an end in itself.


Depending on how prevalent this is in your code, the StringBuilder way may be better.

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

You can mix in the constant too...

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

tabs.Append(SPACE);


Extend string to give you a method to add space

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

Awful in it's own right though.


The more "OO" way would be to find a simpler way of solving your larger business problem. For example, the fact that you have a variable named tabs suggests to me that you are trying to roll your own column alignment code. String.Format supports that directly, e.g.

// 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));
}


If the language allowed for it you could add an extension property to the type String which was Space, something like:

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

but that isn't possible. I think it would be better to keep the space inside the property if it was a localizable thingy, but I think spaces are universal across all languages.


I think you are taking OO way to far.. A simple addition of a space does not need an entire class.

tabs += new String(' ');

or

tabs += " ";

is just fine.


You could use "\t", I think, to give you a tab character. That might make the spaceing more clear.


StringBuilder.Insert and StringBuilder.Append allow you to create any number spaces, e.g. sb.Insert(0, " ", 20) will insert 20 spaces to the start of your sb (StringBuilder) object.


You may create class extensions.

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

and you can call this.

String.GetSPace();


I tend to use string.Empty.PadLeft(8) for example

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜