![](/img/trans.png)
[英]How to assign a value to a property of an object only if that object is not null in 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.