2013-09-08 4 views
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); 
... 

Есть некоторые препроцессоры директивы или каким-либо другим способом достижения этого?

P.S. Я уже знаю, что const string tabLevel2 = tabLevel1 + tabLevel1; работает, возможно, из-за this. Я ищу общий случай для произвольного n.

РЕДАКТИРОВАТЬ

Я хотел бы уточнить, почему мне нужно const и не static readonly: Константы используются в качестве параметров к собственности декоратора, например, [GridCategory(tabLevel2)], и должен быть известен во время компиляции.

+0

Сколько раз вы хотите его повторить? Я не думаю, что это важно. ** constant - это то, что вы должны чувствовать удовлетворенным, даже если вам нужно набирать сотни строк, чтобы объявить их **. «Win32 Constants» - пример. –

ответ

1

Поскольку вам нужны константы для использования в определениях атрибутов, и поскольку все константы должны быть оценены во время компиляции, лучшее, что вы можете сделать, это либо использовать строковые литералы, либо выражения, которые включают в себя другие константы и строковые литералы. Другой альтернативой было бы обеспечить альтернативную реализацию атрибута, который принимает, а не строковое представление уровня табуляции, но числовое значение для него и, возможно, символ табуляции.

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

[ExtendedGridCategory(2,'\t')] 
public string Foo { get; set; } 
+0

принято из-за умной идеи с атрибутом subclass :) – bavaza

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

Надеюсь, это поможет.

+0

спасибо, но, как сказал Магнус, ваш код не будет компилироваться. Вы не можете вызвать метод (даже статический) и не использовать оператор 'new' для' const'. Значение должно быть известно во время компиляции. – bavaza