我可以在声明时重复一个常量字符串吗?

本文关键字:一个 常量 字符串 声明 我可以 | 更新日期: 2023-09-27 18:30:45

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

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

是否有一些预处理器指令或其他方法可以实现此目的?

附言我已经知道const string tabLevel2 = tabLevel1 + tabLevel1;有效,可能是由于这个原因。我正在寻找任意n的一般情况.

编辑

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

我可以在声明时重复一个常量字符串吗?

你不能在 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);

希望对您有所帮助。

由于您需要在属性定义中使用常量,并且所有常量都必须能够在编译时计算,因此您能做的最好的事情是使用字符串文本或涉及其他常量和字符串文本的表达式。 另一种替代方法是提供属性的替代实现,该属性不是采用选项卡级别的字符串表示形式,而是它的数值,可能还有选项卡字符。

 public class ExtendedGridCategoryAttribute : GridAttribute
 {
      public ExtendedGridCategoryAttribute(int level, char tabCharacter)
          : base(new string(tabCharacter, level))
      {
      }
 }
 [ExtendedGridCategory(2,''t')]
 public string Foo { get; set; }
你可以

这样做

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