是只读自动实现的属性可能吗?

我在MSDN上发现了一个话题,说是的,这是可能的。

我做了一个testing,似乎打破了这个说法:

using System; namespace Test { class Program { static void Main(string[] args) { Foo f = new Foo("1"); Console.WriteLine(f.Bar); // prints 1 f.Test("2"); Console.WriteLine(f.Bar);// successfully prints 2 } } class Foo { public Foo(string b) { this.Bar = b; } public string Bar { get; private set; } public void Test(string b) { // this would be impossible for readonly field! // next error would be occur: CS0191 or CS0191 // A readonly field cannot be assigned to (except in a constructor or a variable initializer) this.Bar = b; } } } 

我错在哪里?

以下答案于2010年写回。在C#6(2015年发布)中,您可以编写只读自动实现的属性:

 // This can only be assigned to in a constructor public int Foo { get; } 

你是绝对正确的。 正确的只读自动执行的属性目前是不可能的。 使setter私人不是一回事,不pipe什么书和MSDN可能会说:)

如果我统治世界,情况就不会如此。 当我在6月份看到NDC 2010上的一些语言devise师时,我打算试图说服,贿赂,哄骗,一般会让自己讨厌,直到他们同意为止。 毕竟,这只是一个薄薄的function。

看看这篇MSDN文章,文本本身并没有说它会创build一个只读的自动属性。 它使用自动属性创build不可变types,这是正确的。 唯一有问题的部分是评论说

 // Read-only properties. 

…这是绝对错误的。 框架同意我们:

 var prop = typeof(Contact).GetProperty("Name"); Console.WriteLine(prop.CanWrite); // Prints True 

该属性在Foo类以外是只读的。 我认为这正是文章的目的。

但是用readonly关键字标记variables是不一样的。

这很混乱。 你应该区分只读的C# readonly (这是关键字的意思)。

  • 只读:意思是说外面没有人可以直接写信给它,只能读。
  • C# readonly :只能在构造函数中写入,而不能更多。

不,不可能只读自动实现的属性。 对于您链接的页面:

使用自动实现的属性,get和set访问器都是必需的

只读属性没有设置访问器。

没有设置访问器的属性被认为是只读的

在C#和VB中,ReadOnly关键字在应用于字段时会执行相同的操作。 它们使得字段只能在静态初始化期间(如果它被标记为静态/共享字段)或在构造函数期间分配。

C#不使用readonly关键字。

VB中的ReadOnly关键字在应用于Property时具有不同的含义。 在这种情况下,它只是意味着没有可接受的方式来分配公共属性(内部,当然可以修改其他内部代码的后台字段)。

无法创buildreadonly自动实现的属性。 如果您尝试使用自动实现的属性编译一个类,那么如果它没有get和set,就会得到这个错误:

“ProjectName.ClassName.Property.get”必须声明一个主体,因为它没有标记为抽象或外部。 自动实现的属性必须同时定义get和set访问器。

用“自动”开始的句子是我们所关心的错误的一部分。

私人设置不同于readonly

类似于方法或字段, private关键字使setter的可见性仅对类本身可用。 其他对象不能使用setter,但类的方法本身可以自由地调用它。 因此,你的testing代码编译和工作正常。

它看起来像外部对象readonly属性,但它不是只读的真正的定义。