繁体   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