0

我有一组相互关联的常量字符串:

private const string tabLevel1 = "\t";
private const string tabLevel2 = "\t\t";
private const string tabLevel3 = "\t\t\t";
...

我正在寻找一种更优雅的方式来声明这些,例如:

private const string tabLevel1 = "\t";
private const string tabLevel2 = REPEAT_STRING(tabLevel1, 2);
private const string tabLevel3 = REPEAT_STRING(tabLevel1, 3);
...

是否有一些预处理器指令或其他方式来实现这一点?

PS我已经知道这const string tabLevel2 = tabLevel1 + tabLevel1;行得通,可能是因为这个。我正在寻找任意的一般情况n

编辑

我想澄清为什么我需要const而不是static readonly:常量用作属性装饰器的参数,例如[GridCategory(tabLevel2)],并且必须在编译时知道。

4

3 回答 3

2

你不能在 C# 中做到这一点。在 c# 中也没有像 c 或 c++ 那样的宏预处理器。您最好的选择是使用以下内容:

private const string tabLevel1 = "\t";
private static readonly string tabLevel2 = new string('\t',2);
private static readonly string tabLevel3 = new string('\t',3);

希望能帮助到你。

于 2013-09-08T15:10:28.093 回答
1

因为您需要在属性定义中使用常量,并且因为必须能够在编译时评估所有常量,所以您可以做的最好的事情是使用字符串文字或涉及其他常量和字符串文字的表达式。另一种选择是提供属性的另一种实现,它采用的不是制表符级别的字符串表示,而是它的数值,可能还有制表符。

 public class ExtendedGridCategoryAttribute : GridAttribute
 {
      public ExtendedGridCategoryAttribute(int level, char tabCharacter)
          : base(new string(tabCharacter, level))
      {
      }
 }

 [ExtendedGridCategory(2,'\t')]
 public string Foo { get; set; }
于 2013-09-08T15:15:02.563 回答
0

你可以这样做

private const int tabCount = 10;
private string[] tabs = new string[tabCount];
void SetTabs()
{
  string tab = "";
  for(int x = 0; x<=tabCount - 1; x++)
  {
    tab += "\t";
    tabs[x] = tab;
  }
}
于 2013-09-08T15:08:47.120 回答