Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何修复”;CA1810:初始化引用类型静态字段内联;有一个抽象的基础。。。?_C#_Inheritance_Static_Constructor_Abstract - Fatal编程技术网

C# “如何修复”;CA1810:初始化引用类型静态字段内联;有一个抽象的基础。。。?

C# “如何修复”;CA1810:初始化引用类型静态字段内联;有一个抽象的基础。。。?,c#,inheritance,static,constructor,abstract,C#,Inheritance,Static,Constructor,Abstract,下面是我的代码的简化部分: abstract class DataManager<TValue> { protected static Dictionary<string, TValue> Values; } 抽象类数据管理器 { 受保护的静态字典值; } 然后我有: class TextManager : DataManager<string> { static TextManager() { Values = .

下面是我的代码的简化部分:

abstract class DataManager<TValue>
{
    protected static Dictionary<string, TValue> Values;
}
抽象类数据管理器
{
受保护的静态字典值;
}
然后我有:

class TextManager : DataManager<string>
{
    static TextManager()
    {
        Values = ... // Fill with data
    }
}
类文本管理器:数据管理器
{
静态文本管理器()
{
值=…//用数据填充
}
}
现在我得到了CA1810。我看到了一些解决方案,比如将
公开并在其他地方设置它们,但我不喜欢这样,或者在
TextManager
中创建一个静态方法来做同样的事情,但在程序启动时调用,但我也不喜欢这样

我认为从示例中可以明显看出,
每个
TValue
只应填写一次。那么,你认为这里的最佳解决方案是什么呢?

我会关闭规则。 问题是,您有一个规则(AFAIK)是为了警告您使用静态构造函数可能会对性能造成的影响。 我想说,静态属性的初始化可以通过静态构造函数或内联(as)完成。在您的情况下,您无法在线执行此操作,因为:

  • 子类中只有实际值
  • 没有抽象静态方法,因此不能将实际的内联初始化委托给TextManager
  • 这就剩下了静态构造函数选项,这基本上意味着关闭规则(这意味着“是的,微软。我知道这可能会对性能造成危险,但我知道我在做什么”)

    状态:“如果性能不是问题,或者静态初始化导致的全局状态更改代价高昂,或者必须保证在调用该类型的静态方法或创建该类型的实例之前发生,则可以安全地禁止此规则发出警告。”

    =======================================================================

    试试这个(警告:在Mono 2.6.7上测试,而不是在.NET上测试):

    抽象类数据管理器
    {
    受保护的静态字典值=新字典();
    }
    类TextManager:DataManager
    {
    静态文本管理器()
    {
    添加(“测试”、“测试”);
    }
    公共静态字符串测试()
    {
    返回值[“测试”];
    }
    }
    类IntManager:DataManager
    {
    静态IntManager()
    {
    添加(“测试”,1);
    }
    公共静态int测试()
    {
    返回值[“测试”];
    }   
    }
    公共静态void Main(字符串[]args)
    {
    Console.WriteLine(IntManager.test());
    Console.WriteLine(TextManager.test());
    }
    
    代码分析警告就是这样,旨在标记潜在问题的警告。如果你有很好的理由去做你要做的事情,那么就去做。

    当另一个类出现时,比如说另一个类出现时,你会怎么做?DataManager:DataManager想要以不同的方式初始化值?对不起,我没有解释,我不需要这个。。。我只需要字符串、整数和这两种类型的
    列表的管理器。。。我不认为有必要进行更深入的研究。但是编译器是如何知道这一点的呢?所以。。。我可以做些什么来让编译器“理解”?:)我不是说我的代码很好,欢迎任何建议。。。
    DataManager
    的其余代码与此无关,它与
    Values
    字段一起工作,而
    TextManager
    有一些特定于字符串的方法。您还可以使您的属性不是静态的,并使您的TextManager成为单例(或者更好的是,如果您使用的是IOC容器,您的TextManager可以是在单例作用域中实例化的常规类)
    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());    
    }