我想知道是否有更多面向对象的方式在 C# 中创建空间。
字面上的空间代码!
我目前有tabs += new String(" ");
,我不禁觉得这有点让人想起使用""
而不是String.Empty
.
我可以用什么来创建不是的空间" "
?
你可以写
" "
代替
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';
}
}
}
既然你已经在评论中澄清了:
在我的实际代码中,我正在做 new String(' ',numberOfSpaces) 所以我可能仍然需要使用新的 String 部分。
...到目前为止,其他答案实际上是无用的:(
你可以写:
const char Space = ' ';
然后使用
new string(Space, numberOfSpaces)
但我没有看到任何好处
new string(' ', numberOfSpaces)
如果空格数会发生变化,那么您可以执行以下操作:
public static string Space(int count)
{
return "".PadLeft(count);
}
Space(2);
没有理由这样做。在其他条件相同的情况下,更小的代码就是更好的代码。String.Empty
和 和new String(' ')
交流同样的事情""
," "
他们只是需要更多的角色来做。
试图让它“更多 OO”只是添加字符而没有任何好处。面向对象本身并不是目的。
根据这在您的代码中的普遍程度,StringBuilder 方式可能会更好。
StringBuilder tabs = new StringBuilder();
...
tabs.Append(" ");
你也可以混入常数...
StringBuilder tabs = new StringBuilder();
const string SPACE = " ";
...
tabs.Append(SPACE);
扩展字符串为您提供添加空间的方法
public static string AddSpace(this String text, int size)
{
return text + new string(' ', size)
}
可怕的是它自己的权利。
更“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));
}
如果语言允许,您可以将扩展属性添加到类型为 Space 的 String 中,例如:
public static class StringExt
{
public static char Space(this String s)
{
get {
return ' ';
}
}
}
但这是不可能的。我认为如果它是可本地化的东西,最好将空间保留在属性内,但我认为空间在所有语言中都是通用的。
我认为您正在采取 OO 方式。简单地添加一个空格不需要整个类。
tabs += new String(' ');
或者
tabs += " ";
很好。
StringBuilder.Insert 和 StringBuilder.Append 允许您创建任意数量的空格,例如 sb.Insert(0, " ", 20) 将在您的 sb (StringBuilder) 对象的开头插入 20 个空格。
我认为,您可以使用"\t"
给您一个制表符。这可能会使间隔更清晰。
您可以创建类扩展。
public static class StringExtensions
{
public static string GetSpace(this String)
{
return " ";
}
}
你可以打电话给这个。
String.GetSPace();