C# 只读自动实现属性是否可能?

C# 只读自动实现属性是否可能?,c#,.net,properties,msdn,readonly,C#,.net,Properties,Msdn,Readonly,我找到了一个话题,是的,这是可能的 我做了一个测试,似乎打破了这个说法: 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")

我找到了一个话题,是的,这是可能的

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

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私有化不是一回事,不管一些书籍和MSDN会怎么说:)

如果我统治世界,情况就不会是这样了。当我在六月份的会议上看到一些语言设计师时(请大家一起来!),我打算尝试说服、贿赂、哄骗,通常会让自己感到讨厌,直到他们同意为止。毕竟,这只是一个薄薄的功能

看看那篇MSDN文章,文本本身并没有说它创建了一个只读的自动属性。它使用自动属性创建一个不可变类型,这是正确的。唯一有问题的是评论说

// Read-only properties.
。。。这绝对是错误的。该框架与我们一致:

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

私有集与
只读
不同

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


在外部对象看来,它是一个只读属性,但在真正的定义中它不是只读的。

该属性在
Foo
类之外是只读的。我想这就是这篇文章的意思


但这与用
readonly
关键字标记变量不同。

这很容易混淆。您应该将只读区分为c#
只读
(关键字的含义)

  • 只读:他们的意思是外面的人不能直接写,只能读
  • C#
    只读
    :您只能在构造函数中写入它,然后再也不能写入

不,无法将自动实现的属性设置为只读。对于您链接的页面:

对于自动实现的属性,需要get和set访问器

只读属性没有设置访问器

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

C#不将readonly关键字用于其他任何内容


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

不可能创建一个
只读的
自动实现的属性。如果尝试编译具有自动实现属性的类,如果该类没有get和set,则会出现以下错误:

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


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

我认为您在测试错误的只读类型。您的代码只是说,不允许您直接从类之外的任何位置或子类(私有setter)设置属性栏。如果setter是私有的,那么类方法仍然可以更改变量。。。公共只读字符串栏怎么样?@peterchen:这不是一个自动实现的属性。Mods:Dupe with:和@abatishchev:那么也许它们应该合并到您的属性中。我偶然发现这个问题,发现谷歌点击率1、2和3是这里的三个问题!一个极薄的功能可以转化为多人一周的工作:你不必让我们相信这是个好主意;我们知道这是个好主意。问题是(1)考虑到我们的时间和金钱预算,这是我们能做的最好的功能吗?(2)我们能把预算花在解决不变性的一些更一般、更困难、更“薄”的方面吗?其中不变性道具是一个简单的特例?我们添加的每一个狭隘的“特殊目的”特性都会增加语法的复杂性;我们想确保我们在这一额外的复杂性方面取得了良好的进展。@Eric:从各个方面都理解——任何解决更广泛的不变性问题的尝试都是非常受欢迎的。我可能应该向其他人指出,Eric在几乎所有人类已知的通信媒体上都耐心地听取了我的这一功能请求:)提醒你,添加功能是痛苦的,这有一个好处:对于一个富有想象力的团队来说,添加这么多功能会让我们这些凡人难以跟上。@Shimmy:是的,我想是的。@Shimmy:Use
FieldInfo.IsInitOnly
@abatischchev在c#中有一个只读关键字,这就是我想要的meant@persuade字体是的,我也在谈论它。我的意思是,C#中的某些内容在没有readonly关键字的情况下不是只读的。最好用其他方式来称呼它。Java关键字“final”实际上可能比“readonly”更合适。很明显,它不是只读的,因为你可以在构造函数中设置它,“get-only”怎么样?