Я бы отключил правило.
Дело в том, что у вас есть правило, которое (AFAIK) предназначено для предупреждения о потенциальном падении производительности при использовании статического конструктора.
Я бы сказал, что инициализация статического свойства может быть сделана с помощью статического конструктора или встроенного (как предложено MSDN ). В вашем случае вы не можете сделать это встроенным, потому что:
- у вас есть только фактические значения в подклассе
- абстрактного статического метода не существует, поэтому вы не можете делегировать фактическую встроенную инициализацию в TextManager.
Таким образом, остается опция статического конструктора, которая в основном означает отключение правила (что означает «да, Microsoft. Я знаю, что это может быть опасно для производительности, но я знаю, что я делаю»).
MSDN заявляет: «Безопасно подавить предупреждение из этого правила, если производительность не является проблемой, или если глобальные изменения состояния, вызванные статической инициализацией, дороги или должны гарантированно произойти до того, как вызывается статический метод типа или создается экземпляр типа. "
=============================================== ========================
Попробуйте это (предупреждение: протестировано на Mono 2.6.7, а не .NET):
abstract class DataManager<TValue>
{
protected static Dictionary<string, TValue> Values=new Dictionary<string, TValue>();
}
class TextManager : DataManager<string>
{
static TextManager()
{
Values.Add("test","test");
}
public static string test()
{
return Values["test"];
}
}
class IntManager : DataManager<int>
{
static IntManager()
{
Values.Add("test",1);
}
public static int test()
{
return Values["test"];
}
}
public static void Main (string[] args)
{
Console.WriteLine(IntManager.test());
Console.WriteLine(TextManager.test());
}