繁体   English   中英

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

[英]Is read-only auto-implemented property possible?

我在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; 
        }
    }
}

我哪里错了?

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

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

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

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

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

// Read-only properties.

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

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

该属性在Foo类之外是只读的。 我认为那是文章的内容。

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

这令人困惑。 您应该将readonly c# readonly (关键字的含义)。

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

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

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

只读属性具有NO set访问器。

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

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

C#不会将readonly关键字用于其他任何事情。

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

无法创建readonly自动实现的属性。 如果您尝试使用自动实现的属性编译一个类,如果它没有get和set,则会出现此错误:

'ProjectName.ClassName.Property.get'必须声明一个body,因为它没有标记为abstract或extern。 自动实现的属性必须定义get和set访问器。

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

私人套装与readonly

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM