我可以为 C# 自动实现的 属性(a.k.a.auto 支持字段)定义自定义 getter 吗?

Can I define a custom getter for a C# auto-implemented property (a.k.a. auto backing field)?

注意:我知道如何 在不使用 的情况下使用自动实现的属性来完成此操作,但我想知道 C# 是否具有执行此操作的内置方法。

假设我有一个自动实现的简单示例 属性(a.k.a。自动支持字段):

public class MyClass
{
    public MyClass(){}
    public string MyString { get; private set; }
}

现在,如果自动支持字段为空,我想 return 在 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 将抛出异常。

将验证放在 setter and/or 中确保构造函数设置 valid/non-null 默认值。

或者使 属性 可以为空以提示客户他们必须考虑空值的可能性。

或者(但由于多种原因不太理想),将 属性 设为私有并添加访问它的方法。

强烈反对属性直接抛出异常。您或消费者有时会不喜欢结果。

不,您不能通过这种方式访问​​支持字段。

您必须定义支持字段并验证它。

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;
}

正如 Fred 所说,最好在 属性 之外进行验证。

我很惊讶没有人提到 field 关键字,这正是您所要求的(在您的示例中您将使用而不是 [backing field])。它应该与 C# 10 一起提供。它似乎将与 C# 11 一起提供 (?)

搜索字段关键字 here