【问题标题】:C# expression body with {get;} vs without [duplicate]带有 {get;} 的 C# 表达式主体与没有 [重复]
【发布时间】:2017-03-20 15:32:04
【问题描述】:

由于我不知道适用于此的术语,我不确定在此搜索现有的 cmets。

我最近在一个类似于以下的表达式主体上浪费了大量时间:

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

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

它表现得好像一切都很好。但实际值从未改变。当我改为插入 {get;} 时:

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

它工作正常。

有趣的是,如果这开始是一个普通的 get(使用 get {return ..} 然后 ReSharper(?) 提供将其转换为第一个版本。

无论如何,我想了解两者之间的区别(不,不是在 CLR 级别),但只是为了 a) 知道如何以适当的术语来指代每一个,b) 为什么一个有效而另一个只是假装工作。

谢谢!

【问题讨论】:

  • 简单的TryRoslyn 显示了不同...
  • 如果我没记错的话,表达式主体总是会再次计算值(即,每次您从 SearchSomeModel 读取值时,它都会调用您在其中编写的构造函数调用),而您的第二个示例只是初始化一个具有一个值的属性,然后将其存储并可以修改。
  • 搜索您的问题的确切标题会导致(很多)页面解释您的问题的答案,所以很明显您确实知道此问题的合适搜索词.
  • @Servy 是这样吗?如果是这样,那么这是一个骗局,不是吗?
  • @Fildor 最重要的结果主要是语言文档(希望如此)。

标签: c# properties expression


【解决方案1】:

第一行代码——

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

意味着每次你尝试get它时,它都会创建一个ShowSomeViewModel的新实例。
相当于:

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

另一方面,

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

表示您正在设置默认值。

【讨论】:

  • 谢谢!既然你提到它,这似乎相当清楚。是否有一个术语可以表示其中一种或两种只是不同类型的表达体?
  • 这是一个重要的区别。虽然这不是一个硬性规则,但如果我第二次“调用”get 而不对对象进行任何更改,我将得到相同的值。这是一个“属性的东西”(又名“mutator”或“accessor”)。
  • @JustMeToo 您提到的第一个是表达式主体属性,我相信第二个可以称为带有初始化程序的仅 getter 自动属性 ​​- 这是一个相当长的期限,不是是吗?
【解决方案2】:

代码

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 的新实例,而使用第一种形式时,每次调用都会返回相同的对象。

第二种形式不起作用的原因是您更新旧实例上的值,但是当您第二次调用该属性以检查值时,您获得了一个没有您更改的视图模型的新实例.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多