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: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());
}