Как исправить "CA1810: Инициализировать статические поля ссылочного типа встроенными" с абстрактным основанием...?
Вот упрощенные части кода, которые у меня есть:
abstract class DataManager<TValue>
{
protected static Dictionary<string, TValue> Values;
}
и тогда у меня есть:
class TextManager : DataManager<string>
{
static TextManager()
{
Values = ... // Fill with data
}
}
И теперь я получаю CA1810. Я вижу несколько решений, таких как Values
public и устанавливая их в другом месте, но мне это не нравится, или создание статического метода в TextManager
делать то же самое, но вызывается при запуске программы, но мне это тоже не нравится.
Я думаю, что это видно из примера, Values
должен быть заполнен только один раз за TValue
, Итак, что вы думаете, будет лучшим решением здесь?
2 ответа
Я бы выключил правило. Дело в том, что у вас есть правило, которое (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());
}
Предупреждения анализа кода - это просто предупреждения, предназначенные для обозначения потенциальных проблем. Если у вас есть веская причина делать то, что вы делаете, то делайте это.