C#表达式主体与{get;} vs没有

时间:2017-03-20 15:32:05

标签: c# properties expression

由于我不知道适用于此的术语,我不知道如何搜索现有的评论。

我最近浪费了大量时间,表达体类似于:

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...};

当我尝试设置诸如以下的值时:
     SearchSomeModel.Property = 12345;

一切都很好。但实际价值从未改变。当我改为插入{get;}时,如:

public SomeListViewModel SearchSomeModel {get;} =  new ShowSomeViewModel{...};

它工作正常。

有趣的是,如果这是以正常的get开始(使用get {return ..},那么ReSharper(?)会将其转换为第一个版本。

无论如何,我想了解两者之间的区别(不,不是在CLR级别),而只是为了a)知道如何引用每个中的正确术语和b)为什么一个有效,另一个只是假装工作

谢谢!

2 个答案:

答案 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的新实例,当使用第一个表单时,每次调用都会获得相同的对象。

第二种形式不起作用的原因是您在哪里更新旧实例的值,但是当您第二次调用属性来检查值时,您获取的视图模型的新实例没有您的更改