作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码的简化部分:
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 )完成。在您的情况下,您不能内联进行,因为:
因此留下了静态构造函数选项,这基本上意味着关闭规则(这意味着“是的,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/
我是一名优秀的程序员,十分优秀!