【问题标题】:Why do automatic properties require both getters AND setters?为什么自动属性需要 getter 和 setter?
【发布时间】:2008-12-03 14:15:58
【问题描述】:

在 C# 中,如果我声明了一个自动实现的属性,为什么我必须同时声明 get 和 set 部分?

public string ThisWorks { get; set; }

public string ThisDoesnt { get; }

这不只是语法糖——即编译器为属性插入一个私有字段吗?那么为什么会出现问题呢?

好奇。

【问题讨论】:

  • 两者都能正常工作。我一直在使用它们。
  • 但是记得给属性添加一个类型。您的示例不会像现在这样工作。
  • 哎呀,干杯!但是我必须带你去处理你的声明 - 我得到一个编译器错误,直接了。
  • @ALL:谢谢——那是一本用于盲人之书的!因为我是在构造函数中设置它,所以我按照 Jon Skeet 的思路思考,错过了其他情况。

标签: c# .net automatic-properties


【解决方案1】:

如果您没有 setter - 那么您将如何设置属性?

顺便说一句,您可以指定可访问性,例如:

public string Foo
{
  get;
  private set;
}

【讨论】:

    【解决方案2】:

    如果没有 setter,您将永远无法提供值 - 因为您无法指定支持变量的名称。

    我请求了一个只读的自动属性,声明如下:

    public string ReadonlyProperty { get; readonly set; }
    

    这将创建一个只读支持变量,一个只有一个 getter 的属性,并将所有对 setter 的调用转换为对变量的直接访问。您只能在构造函数中调用 setter - 就像普通的只读变量一样。

    我们将看看这个请求是否有任何好处......很遗憾它目前不在那里,因为它使得实现不可变类型比实现可变类型更难:(

    【讨论】:

    • 这会提供什么:“public readonly string ReadonlyProperty”除了能够在访问属性时断点吗?
    • @ffpf - 公共只读字符串 Blah;
    • 请参阅 csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx,了解为什么我不喜欢公开 sometimes 常量以外的公共字段。
    • VB 10 可能会得到:“ReadOnly Property MaxItems As Integer = 100”
    • @jon:谢谢,这很有意义。我没有考虑序列化或参考点。 @Timothy:我理解其中的区别。这不是我在这个例子中要表达的意思。谢谢。
    【解决方案3】:

    自动实现的属性没有可访问的私有存储,因此如果没有 setter,您将无法设置值,使其完全无用。

    【讨论】:

      【解决方案4】:

      您需要一个集合 - 否则,您的自动实现的属性如何获得其价值?自动实现该属性时,您必须有一个 set 访问器,以便在构造期间至少为其赋予一个值。

      【讨论】:

        【解决方案5】:

        有趣的是,Visual Studio 2015 中的新 Roslyn 编译器现在允许这样做,即使项目配置为使用 C# 版本 5。

        【讨论】: