如何使用抽象基础修复“CA1810:内联初始化引用类型静态字段”...?

ava*_*e70 5 c# inheritance static constructor abstract

这是我拥有的代码的简化部分:

abstract class DataManager<TValue>
{
    protected static Dictionary<string, TValue> Values;
}
Run Code Online (Sandbox Code Playgroud)

然后我有:

class TextManager : DataManager<string>
{
    static TextManager()
    {
        Values = ... // Fill with data
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,现在我得到了 CA1810。我看到了一些解决方案,比如Values将它们公开并在其他地方设置,但我不喜欢那样,或者创建一个静态方法TextManager来做同样的事情,但在程序启动时被调用,但我也不喜欢那样.

我认为从示例中可以明显Values看出,每个TValue. 那么,您认为这里的最佳解决方案是什么?

Pao*_*lla 5

我会关闭规则。问题是,您有一个规则 (AFAIK) 旨在警告您使用静态构造函数的潜在性能影响。我会说静态属性的初始化可以通过静态构造函数或内联(如MSDN建议的)来完成。在您的情况下,您不能内联,因为:

  1. 你只有子类中的实际值
  2. 没有抽象静态方法之类的东西,因此您不能将实际的内联初始化委托给 TextManager。

所以剩下静态构造函数选项,这基本上意味着关闭规则(这意味着“是的,微软。我知道这可能对性能有危险,但我知道我在做什么”)。

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());    
}
Run Code Online (Sandbox Code Playgroud)