c# - 如何用抽象基础修复 "CA1810: Initialize reference type static fields inline"...?

标签 c# inheritance static constructor abstract

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

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 填充一次。那么,您认为最好的解决方案是什么?

最佳答案

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

  1. 您只有子类中的实际值
  2. 没有抽象静态方法这样的东西,所以您不能将实际的内联初始化委托(delegate)给 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());    
}

关于c# - 如何用抽象基础修复 "CA1810: Initialize reference type static fields inline"...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090076/

相关文章:

c# - Unity 单例管理器类

c# - 将焦点设置到控件模板内的子元素

Java:重写泛型方法

java - Java中静态方法中调用非静态方法(非静态变量错误)

java - Java中静态变量和静态 block 是如何分配内存的?

java - 我是否正确使用了 'static' 关键字?

c# - 将 ASP.NET 应用程序部署到 Web 服务器所需的最少文件

c# - 如何使用 MediatR 进行测试

javascript - 继承 React 组件的正确方式

C++ 继承和访问 protected 基类成员 : is doing it Java-style a bad idea?