为什么自动属性需要同时具有getter和setter方法?

4
在C#中,如果我声明了一个自动实现属性,为什么我必须同时声明get和set部分?
例如:
public string ThisWorks { get; set; }

public string ThisDoesnt { get; }

这只是语法糖吗,编译器会为属性插入一个私有字段,那么问题出在哪里呢?好奇心驱使。

两个都正常工作。我经常使用它们。 - Rune Grimstad
但请记得为属性添加类型。您现在的示例无法正常工作。 - Rune Grimstad
哎呀,干杯!但是我必须对你的说法提出质疑 - 我直接得到了编译器错误。 - Duncan
@所有人:谢谢 - 这是《显而易见之书》中的一条!因为我在构造函数中设置它,所以我一直在沿着Jon Skeet的思路走,错过了其他情况。 - Duncan
5个回答

29

如果您没有setter,那么您怎么设置属性呢?

顺便提一下,您可以指定可访问性,例如:

public string Foo
{
  get;
  private set;
}

12
没有setter,你永远无法提供一个值 - 因为你没有任何一种指定后备变量名称的方式。
我已经请求了一个只读的自动属性,声明如下:
public string ReadonlyProperty { get; readonly set; }

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

我们将看到这个请求是否有帮助...很遗憾目前还没有它,因为它使得实现不可变类型比可变类型更难 :(


除了能够在访问属性时设置断点之外,这会提供什么,而 "public readonly string ReadonlyProperty" 不会提供呢? - Jeff Yates
@ffpf - 公共只读字符串 Blah; <-- 这不是属性,而是字段。你需要一个 get/set 才能成为“属性”。字段不会被像数据绑定、属性网格等这样的东西所捕获。它们具有不同的语义含义。 - Timothy Khouri
请参阅http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx,了解为什么我不喜欢公开字段,除非是*有时候*常量。 - Jon Skeet
VB 10 可能会得到这样的代码:"ReadOnly Property MaxItems As Integer = 100"。 - Jonathan Allen
@jon:谢谢,这很有道理。我没有考虑到序列化或引用点。@Timothy:我理解它们的区别。但这不是我在这种情况下要表达的重点。谢谢。 - Jeff Yates

11

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


3
您需要一个“set” - 否则,您的自动实现属性如何获得其值?当自动实现属性时,您必须至少拥有一个set访问器,在构造期间为其赋值。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接