簡體   English   中英

我可以為 C# 自動實現的屬性(也稱為自動支持字段)定義自定義 getter 嗎?

[英]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.

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