簡體   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