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

问题描述 投票:0回答:3

注意:我知道如何使用自动实现的属性来完成此而不,但我想知道 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
将抛出异常。

c# getter-setter syntactic-sugar automatic-properties backing-field
3个回答
3
投票

不可以,您无法通过这种方式访问支持字段。

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

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 所说,最好在财产之外进行验证。


1
投票

user3163495 于 2024 年 4 月 25 日更新:该功能计划在 C# 13 / .NET 9 中使用。

链接:https://github.com/dotnet/csharplang/issues/140#issuecomment-1940720831


原答案:

我很惊讶没有人提到

field
关键字,这正是您所要求的(您在示例中将使用什么来代替
[backing field]
)。它本来应该随 C# 10 一起发布。现在看来它将随 C# 11 一起发布(?)

搜索字段关键字此处


1
投票

将验证放入 setter 中和/或确保构造函数设置有效/非空默认值。

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

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

强烈建议不要直接抛出异常。您或消费者有时会不喜欢结果。

© www.soinside.com 2019 - 2024. All rights reserved.