27

我想知道是否有更多面向对象的方式在 C# 中创建空间。

字面上的空间代码!

我目前有tabs += new String(" ");,我不禁觉得这有点让人想起使用""而不是String.Empty.

我可以用什么来创建不是的空间" "

4

12 回答 12

47

你可以写

" "

代替

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';
        }
    }
}
于 2009-11-11T16:16:58.373 回答
15

既然你已经在评论中澄清了:

在我的实际代码中,我正在做 new String(' ',numberOfSpaces) 所以我可能仍然需要使用新的 String 部分。

...到目前为止,其他答案实际上是无用的:(

可以写:

const char Space = ' ';

然后使用

new string(Space, numberOfSpaces)

但我没有看到任何好处

new string(' ', numberOfSpaces)
于 2009-11-11T16:24:13.773 回答
8

如果空格数会发生变化,那么您可以执行以下操作:

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

Space(2);
于 2009-11-11T16:18:41.370 回答
5

没有理由这样做。在其他条件相同的情况下,更小的代码就是更好的代码String.Empty和 和new String(' ')交流同样的事情""" "他们只是需要更多的角色来做。

试图让它“更多 OO”只是添加字符而没有任何好处。面向对象本身并不是目的。

于 2009-11-11T16:20:35.213 回答
3

根据这在您的代码中的普遍程度,StringBuilder 方式可能会更好。

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

你也可以混入常数...

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

tabs.Append(SPACE);
于 2009-11-11T16:17:23.540 回答
3

扩展字符串为您提供添加空间的方法

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

可怕的是它自己的权利。

于 2009-11-11T16:19:19.527 回答
2

更“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));
}
于 2009-11-11T16:44:40.330 回答
1

如果语言允许,您可以将扩展属性添加到类型为 Space 的 String 中,例如:

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

但这是不可能的。我认为如果它是可本地化的东西,最好将空间保留在属性内,但我认为空间在所有语言中都是通用的。

于 2009-11-11T16:20:51.287 回答
1

我认为您正在采取 OO 方式。简单地添加一个空格不需要整个类。

tabs += new String(' ');

或者

tabs += " ";

很好。

于 2009-11-11T16:31:09.347 回答
0

StringBuilder.Insert 和 StringBuilder.Append 允许您创建任意数量的空格,例如 sb.Insert(0, " ", 20) 将在您的 sb (StringBuilder) 对象的开头插入 20 个空格。

于 2014-04-24T07:42:23.377 回答
0

我认为,您可以使用"\t"给您一个制表符。这可能会使间隔更清晰。

于 2009-11-11T17:19:30.390 回答
0

您可以创建类扩展。

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

你可以打电话给这个。

String.GetSPace();
于 2018-09-26T05:24:58.373 回答