[英]Can I define a custom getter for a C# auto-implemented property (a.k.a. auto backing field)?
注意:我知道如何在不使用自動實現的屬性的情況下完成此操作,但我想知道 C# 是否有內置方法來執行此操作。
假設我有一個自動實現的屬性(又名自動支持字段)的簡單示例:
public class MyClass
{
public MyClass(){}
public string MyString { get; private set; }
}
現在,如果自動支持字段為空,我想在 getter 中返回一個自定義異常:
public class MyClass
{
public MyClass(){}
public string MyString
{
get
{
return [backing field] ?? throw new Exception("MyString is null");
}
private set;
} = null;
}
較新的 C# 版本是否支持這樣的東西? 也許有一些語法糖可以用來代替[backing field]
來訪問編譯器自動創建的支持字段?
關於在 getter 中放置異常的注意事項:我知道這不應該是一種習慣。 但微軟偶爾會這樣做。 例如,如果請求的內容類型不正確,屬性HttpContext.Request.Form
將引發異常。
不,您不能以這種方式訪問支持字段。
您必須定義支持字段並對其進行驗證。
public class MyClass
{
public MyClass(){}
private string? _myString
public string MyString
{
get
{
return _myString ?? throw new Exception("MyString is null");
}
private set => _myString = value;
} = null;
}
正如弗雷德所說,最好在財產之外驗證它。
我很驚訝沒有人提到field
關鍵字,這正是您所要求的(在您的示例中您將使用什么而不是[backing field]
)。 它應該與 C# 10 一起提供。它似乎將與 C# 11 一起提供(?)
在此處搜索字段關鍵字。
將驗證放入 setter 和/或確保構造函數設置有效/非空默認值。
或者使屬性可以為空,以向客戶暗示他們必須考慮空值的可能性。
或者(但由於多種原因不太理想),將屬性設為私有並添加訪問它的方法。
強烈建議不要讓一個屬性直接拋出異常。 您或消費者在某些時候會不喜歡結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.