簡體   English   中英

C# 構造函數如何為只讀屬性賦值?

[英]How can C# constructor assign value to read only property?

我寫了一個只有 get 訪問器的 class 屬性,例如:

public int MyProp { get; }

我不能通過我的 class 中的方法為 MyProp 分配任何值,甚至不能私下分配,也就是說,這不像我有一個私有集。 但是,不知何故,我可以使用如下構造函數為 myProp 設置一個值:

public MyClass (int myProp) { this.MyProp = myProp; }

構造函數是否總是不受屬性訪問器規范的影響? 它們僅在構造函數運行后才有效嗎?

創建自動屬性時,編譯器會自動生成支持字段來支持它。 對於只讀(僅get )屬性,情況仍然如此。 能夠在構造函數中分配給get -only 屬性只是編譯器支持的語法糖 當您分配給屬性時,編譯器會轉換代碼,以便它分配給支持字段

例如,假設您的構造函數:

public MyClass(int myProp)
{ 
    this.MyProp = myProp;
}

這由編譯器翻譯成類似於以下內容:

public MyClass(int myProp)
{ 
    this._myPropBackingField = myProp;
}

您沒有set訪問器的事實會阻止您在其他任何地方分配該屬性。

實際上,支持字段會收到一個“不可描述”的名稱,該名稱是非法的 c#(但有效的 IL),因此會阻止嘗試直接使用該字段。 在編譯器完成工作后,您的示例實際上如下所示:

public class MyClass
{
    [CompilerGenerated]
    private readonly int <MyProp>k__BackingField;

    public int MyProp
    {
        [CompilerGenerated]
        get
        {
            return this.<MyProp>k__BackingField;
        }
    }

    public MyClass(int myProp)
    {
        this.<MyProp>k__BackingField = myProp;
    }
}

請注意,構造函數實際上是直接分配給支持字段<MyProp>k__BackingField ,而不是通過屬性的set ter 間接分配(因為畢竟不存在)。

請參閱此SharpLab 示例

試想如果不允許構造函數初始化這些值,那么這些值有什么用? 它始終是數據類型的默認值,如 int 它將為 0。通過僅使用 get 意味着我們將不允許在初始化后更改該值。

您也可以使用readonly ,默認情況下它是線程安全的。 但是當您使用私有集時,您必須明確處理線程安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM