Как исправить «CA1810: Инициализировать статические поля ссылочного типа встроенными» с абстрактной базой ...? - PullRequest
3 голосов
/ 23 февраля 2011

Вот упрощенные части кода, которые у меня есть:

abstract class DataManager<TValue>
{
    protected static Dictionary<string, TValue> Values;
}

, а затем у меня есть:

class TextManager : DataManager<string>
{
    static TextManager()
    {
        Values = ... // Fill with data
    }
}

И теперь я получаю CA1810.Я вижу несколько решений, таких как обнародование Values и установка их в другом месте, но мне это не нравится, или создание статического метода в TextManager, чтобы сделать то же самое, но вызывается при запуске программы, но яэто тоже не нравится.

Я думаю, из примера видно, что Values следует заполнять только один раз за TValue.Итак, что, по вашему мнению, будет лучшим решением здесь?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Я бы отключил правило. Дело в том, что у вас есть правило, которое (AFAIK) предназначено для предупреждения о потенциальном падении производительности при использовании статического конструктора. Я бы сказал, что инициализация статического свойства может быть сделана с помощью статического конструктора или встроенного (как предложено MSDN ). В вашем случае вы не можете сделать это встроенным, потому что:

  1. у вас есть только фактические значения в подклассе
  2. абстрактного статического метода не существует, поэтому вы не можете делегировать фактическую встроенную инициализацию в 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());    
}
0 голосов
/ 23 февраля 2011

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

...