.NET静态只读字段的初始化

时间:2018-09-07 17:49:54

标签: c# .net

我尝试通过静态字段使用简单的缓存。

代码示例在这里:

private static readonly Dictionary<MetricTypeEnum, MetricDefinitionAttribute> MetricDefinitions;

初始化此静态字段的正确方法是什么?

据我了解,我们有两种选择:

  1. 使用静态构造函数
  2. 使用内联初始化

收费选项:

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。如果我理解正确,那么此选项对于多线程应用程序绝对安全。

但是第二种选择对我来说更优雅……但是我不完全了解它在多线程应用程序中如何与并发一起工作。

我有几个问题:

  1. 这两个选项有什么区别?
  2. 对于多线程应用程序,哪个选项更正确。

更新: 我已经审查了这个SO topic。我的问题与众不同……

我的主要问题:内联成员初始化是否与静态构造函数完全相等?

更新2: 由于这个问题被标记为重复(但我认为它不是重复的),所以我 我自己在这里回答...(感谢@ParrishHusband的帮助和解释)

内联静态成员初始化和静态构造函数之间的主要区别是beforefieldinit标志。

有关Jon Skeet的“ C#深度” topic的更多信息,请查阅。

0 个答案:

没有答案