为什么自动实现的属性必须同时定义get和set访问器

时间:2010-04-08 06:06:25

标签: c# get properties set accessor

当我们定义像

这样的属性时
    public string Name {get; set;}
点网可以使我们的属性代码。但是当我们使用

    public string Name {get;}
    public string Name {set;}

我们面对

'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.

实际上为什么编译器无法自动确定属性并生成代码?有什么问题?

3 个答案:

答案 0 :(得分:56)

因为自动实现的属性为属性值生成自己的后备存储。您无权访问内部商店。

使用

实现属性
  • get get:表示您只能检索值。您不能设置属性值(即使在包含类中)
  • 刚设置:表示您只能设置值。您无法检索属性值。

表示正常属性

private int _data;
public int Data{  get { return _data } };

这里的父类可以在类中的其他地方执行以下操作(它不能使用自动道具)

_data = 100;

注意:您可以像这样定义一个自动道具(这是我最常用的方式)。

public int Data { get; private set;}

这意味着该类的外部客户端无法设置该属性。但是,包含类本身可以通过类定义中的this.Data = x;多次设置属性。

答案 1 :(得分:5)

如果没有setter,则该属性永远不会有除默认值以外的任何内容,因此不会用于任何目的。

答案 2 :(得分:2)

接收此错误的更现代的方案是使用小于VS 2015(或使用小于14的MsBuild)的VisualStudio版本构建使用C#6语法的代码。

在C#6.0中,允许使用没有setter的autoProperties(它们被假定为私有集)。

尝试使用VS2015 +或msbuild 14+编译..或修改代码,以便所有autoProperties都有一个setter。