我尝试通过静态字段使用简单的缓存。
代码示例在这里:
private static readonly Dictionary<MetricTypeEnum, MetricDefinitionAttribute> MetricDefinitions;
初始化此静态字段的正确方法是什么?
据我了解,我们有两种选择:
收费选项:
private static readonly Dictionary<MetricTypeEnum, MetricDefinitionAttribute> MetricDefinitions;
static Metric()
{
MetricDefinitions = InitMetricDefinitions();
}
private static Dictionary<MetricTypeEnum, MetricDefinitionAttribute> InitMetricDefinitions()
{
var result = Dictionary<MetricTypeEnum, MetricDefinitionAttribute>()
// Long operation with reflection...
return result;
}
第二个选项:
private static readonly Dictionary<MetricTypeEnum, MetricDefinitionAttribute> MetricDefinitions = InitMetricDefinitions();
private static Dictionary<MetricTypeEnum, MetricDefinitionAttribute> InitMetricDefinitions()
{
var result = Dictionary<MetricTypeEnum, MetricDefinitionAttribute>()
// Long operation with reflection...
return result;
}
我了解首选方法。我发现了详细信息here。如果我理解正确,那么此选项对于多线程应用程序绝对安全。
但是第二种选择对我来说更优雅……但是我不完全了解它在多线程应用程序中如何与并发一起工作。
我有几个问题:
更新: 我已经审查了这个SO topic。我的问题与众不同……
我的主要问题:内联成员初始化是否与静态构造函数完全相等?
更新2: 由于这个问题被标记为重复(但我认为它不是重复的),所以我 我自己在这里回答...(感谢@ParrishHusband的帮助和解释)
内联静态成员初始化和静态构造函数之间的主要区别是beforefieldinit
标志。
有关Jon Skeet的“ C#深度” topic的更多信息,请查阅。