静态构造函数似乎没有被调用?

时间:2018-03-19 12:03:45

标签: c# .net uwp

我有以下代码:

// using Windows.Storage;
internal static class AppData {
    private static ApplicationDataContainer container;
    public static bool FirstTime { get; } = !GetContainer("UserInfo").Values.ContainsKey("complete");
    static AppData() {
        container = ApplicationData.Current.LocalSettings;
    }
    private static ApplicationDataContainer GetContainer(string name) {
        return container.CreateContainer(name,ApplicationDataCreateDisposition.Always);
    }
}
  

NullReferenceException:未将对象引用设置为对象的实例。

我不知道为什么会出错。对代码进行一些更改

// using Windows.Storage;
internal static class AppData {
    private static ApplicationDataContainer container;
    public static bool FirstTime => !GetContainer("UserInfo").Values.ContainsKey("complete");
    static AppData() {
        container = ApplicationData.Current.LocalSettings;
    }
    private static ApplicationDataContainer GetContainer(string name) {
        return container.CreateContainer(name,ApplicationDataCreateDisposition.Always);
    }
}
  

好的,没有错误。

为什么?

2 个答案:

答案 0 :(得分:6)

我必须查找the reference,但问题是

public static bool FirstTime { get; } = ....;

是初始化程序。作为初始化程序,它在构造函数之前执行。

当你将它改为函数(或只读lambda属性)时,它是一个普通的成员,它在构造函数之后执行。

答案 1 :(得分:4)

两种语法有很大不同:

public static bool Property { get; set; } = true;

这是属性初始化语法,在任何构造函数运行之前进行求值。该物业也可以在这里安装。

public static bool Property => true;

这是一个表达式属性get-only,只有在调用它时才会评估右侧。这也意味着每次访问时都会对其进行评估,因此在右侧使用复杂的方法调用不是一个好的设计选择。

此外,如果您希望获得表达式语法,同时确保只在实际需要时才评估右侧,并且只需要一次,您可以将此语法与私有字段结合使用:

private static bool? _property;

public static bool Property => _property ?? ( _property = CalculateProperty() );

这将首先检查私有支持字段是否为null,如果是,则初始化它,而赋值本身也将返回指定的值。