由于我不知道适用于此的术语,我不知道如何搜索现有的评论。
我最近浪费了大量时间,表达体类似于:
public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...};
当我尝试设置诸如以下的值时:
SearchSomeModel.Property = 12345;
一切都很好。但实际价值从未改变。当我改为插入{get;}时,如:
public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...};
它工作正常。
有趣的是,如果这是以正常的get开始(使用get {return ..},那么ReSharper(?)会将其转换为第一个版本。
无论如何,我想了解两者之间的区别(不,不是在CLR级别),而只是为了a)知道如何引用每个中的正确术语和b)为什么一个有效,另一个只是假装工作
谢谢!
答案 0 :(得分:5)
第一行代码 -
public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...};
表示每次尝试ShowSomeViewModel
时都会创建get
的新实例。
它相当于:
public SomeListViewModel SearchSomeModel {
get {return new ShowSomeViewModel{...};}
}
另一方面
public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...};
表示您正在设置默认值。
答案 1 :(得分:1)
代码
public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...};
被翻译成等效的
private SomeListViewModel _searchSomeModel = new ShowSomeViewModel{...};
public SomeListViewModel SearchSomeModel
{
get
{
return _searchSomeModel;
}
}
代码
public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...};
被翻译成
的等价物public SomeListViewModel SearchSomeModel
{
get
{
return new ShowSomeViewModel{...};
}
}
每次调用属性时使用第二个表单时,您将获得ShowSomeViewModel
的新实例,当使用第一个表单时,每次调用都会获得相同的对象。
第二种形式不起作用的原因是您在哪里更新旧实例的值,但是当您第二次调用属性来检查值时,您获取的视图模型的新实例没有您的更改