是否可以使用只读自动实现属性?

aba*_*hev 59 .net c# msdn properties readonly

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

我做了一个似乎打破了这个声明的测试:

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; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

Jon*_*eet 100

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

// This can only be assigned to in a constructor
public int Foo { get; }
Run Code Online (Sandbox Code Playgroud)

你是绝对正确的.目前不可能正确地执行只读自动实现的属性.让setter私有不是一回事,不管有些书和MSDN可能会说:)

如果我统治世界,情况就不是这样了.当我在6月看到NDC 2010的一些语言设计师时(请一起来!)我打算试图说服,贿赂,哄骗,并且一般会对自己造成麻烦,直到他们同意为止.毕竟,这只是一个薄薄的功能.

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

// Read-only properties.
Run Code Online (Sandbox Code Playgroud)

......这绝对是错的.该框架与我们一致:

var prop = typeof(Contact).GetProperty("Name");
Console.WriteLine(prop.CanWrite); // Prints True
Run Code Online (Sandbox Code Playgroud)

  • 你不必说服我们这是个好主意; 我们知道这是一个好主意.问题是(1)这是我们在给定时间和金钱预算的情况下可以做的最好的功能,以及(2)我们是否可以将预算用于解决一些更普遍,更困难,更"薄"的不可变性方面,其中不可变道具是一个简单的特例?我们添加的每个狭窄的"特殊目的"功能都会增加语法的复杂性; 我们希望确保我们为这种额外的复杂性而获得良好的价值. (27认同)
  • @Eric:在所有方面都有所了解 - 任何解决更广泛的不变性问题的尝试都会非常受欢迎.我应该向其他人指出,Eric已经耐心地听取了我在几乎每个人都知道的通信媒介中的这个功能请求:)有一个*好*关于添加功能很痛苦的事情,请注意:它让它变得更难为一个富有想象力的团队添加如此多的功能,让我们凡人无法跟上. (17认同)

ker*_*vin 8

该物业在课外是只读的Foo.我认为那是文章的内容.

但它与使用readonly关键字标记变量不同.


Sam*_*ijo 6

这令人困惑.您应该将只读区分为c#readonly(关键字的含义).

  • 只读:它们意味着外面没有人可以直接写入,只读.
  • C#readonly:你只能在构造函数中写入它,然后永远不会更多.

  • @abatischchev在c#中有一个只读关键字,这就是我的意思 (2认同)