【问题标题】:Why Automatically implemented properties must define both get and set accessors为什么自动实现的属性必须同时定义 get 和 set 访问器
【发布时间】:2010-04-08 06:06:25
【问题描述】:

当我们定义像这样的属性时

    public string Name {get; set;}

dot net 可以制作我们的属性代码。但是当我们使用

    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.

究竟为什么编译器不能确定属性并自动生成代码?有什么问题?

【问题讨论】:

标签: c# get properties set accessor


【解决方案1】:

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

使用

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

对于普通属性

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

这里的父类可以在类的其他地方执行以下操作(使用 auto props 不能)

_data = 100;

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

public int Data { get; private set;}

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

【讨论】:

  • 可能还值得一提的是“私有集”作为中间解决方案(它可能是 OP 真正寻找的东西”
【解决方案2】:

如果没有设置器,则属性永远不能有默认值以外的任何内容,因此没有任何用途。

【讨论】:

  • 您可以让该属性返回一个集合。通过删除 setter,您将无法更改它的类型,但您仍然可以将项目添加到集合中。
  • @Gorgsenegger - 但关键是如果没有设置器,该属性将始终具有其默认值 - 在引用类型(如集合)的情况下为 null。在这种情况下,没有可以添加项目的集合。
  • 是的,这是真的。我被带走了,想着一个带有私人设置器的属性,然后可以从例如设置。在构造函数中,但你是对的,根本没有任何设置器我似乎没有多大意义:-)
  • 语言可以有效地允许public int Foo {get;} = someFunction()(如所示初始化后备存储)或public const int Foo {get = someConstant;};(等效于public int Foo {get {return someConstant;}},除了前者将在someConstant 实际上是一个常量的编译时间)。
  • @supercat 他们已经为 C# 6 做到了这一点。它被称为 getter-only 自动属性。
【解决方案3】:

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

在 C#6.0 中,允许具有没有设置器的自动属性(它们被假定为私有集)。

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

【讨论】:

    【解决方案4】:

    如何在C#中为null的情况下分配默认值

    "Assign default value to object if value is null in c# [duplicate]" 这个顶部被关闭了,说它被这一个回答了。但是,在我看来,此处发布的所有内容都不能回答该主题,因此我在这里发布(无法在其中发布)对我有用并且我一直在寻找的内容:

    decimal default_value = 0.00m;
    return (decimal?)json['JSON_KEY'] ?? default_value;
    

    在上面的示例中,我试图设置一个默认值,以防从 json 中提取小数为 null(就像我们可以在 kotlin 或 swift 中那样)。 Ps:此实现适用于 .NET 框架的新版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2013-10-24
      • 2015-10-05
      • 2021-05-27
      相关资源
      最近更新 更多