[英]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
(關鍵字的含義)。
readonly
:你只能在構造函數中寫入它,然后永遠不會更多。 在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.