我有以下代码:
// 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);
}
}
好的,没有错误。
为什么?
答案 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
,如果是,则初始化它,而赋值本身也将返回指定的值。