web-dev-qa-db-ja.com

複数の空白文字を含む文字列を作成するための「」の代替

C#でスペースを作成する方法が他にOOがあるかどうか疑問に思っています。

文字通りスペースコード!

私は現在tabs += new String(" ");を持っていますが、これは""の代わりにString.Emptyを使用することを思わせますが、仕方がありません。

" "ではないスペースを作成するために何を使用できますか?

23
Jamie Dixon

あなたは書ける

" "

の代わりに

new String(' ')

それは役立ちますか?


何をするかに応じて、文字と「繰り返し」カウントを受け入れる StringBuilder.Append オーバーロードを調べることができます。

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

またはstringconstructor に、文字から文字列を「繰り返し」カウントして構築します。

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

これでコメントが明確になりました:

実際のコードでは、新しいString( ''、numberOfSpaces)を実行しているため、おそらく新しいString部分を引き続き使用する必要があります。

...これまでのところ、他の答えは事実上役に立ちません:(

あなたできました書きます:

const char Space = ' ';

次に使用する

new string(Space, numberOfSpaces)

しかし、それ以上の利点はありません

new string(' ', numberOfSpaces)
15
Jon Skeet

スペースの数が変わる場合は、次のようなことができます。

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

Space(2);
8
TStamper

これを行う理由はありません。他のすべてが等しい場合、 小さいコードほど良いコード 。 _String.Empty_およびnew String(' ')は、_""_および_" "_と同じことをやり取りしますが、それを行うにはより多くの文字が必要です。

「もっとオブジェクト指向」にしようとすると、文字が追加されるだけで、何のメリットもありません。オブジェクト指向はそれ自体が目的ではありません。

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

より「OO」な方法は、より大きなビジネス上の問題を解決する簡単な方法を見つけることです。たとえば、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

言語で許可されている場合は、スペースのようなString型に拡張プロパティを追加できます。

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();

StringBuilder.InsertとStringBuilder.Appendを使用すると、任意の数値スペースを作成できます。 sb.Insert(0、 ""、20)は、sb(StringBuilder)オブジェクトの先頭に20個のスペースを挿入します。

0
IsolatedStorage

"\t"を使用して、タブ文字を指定できます。それはスペースをより明確にするかもしれません。

0
Matt Ellen