注意:我知道如何使用自动实现的属性来完成此而不,但我想知道 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;
}
正如 Fred 所说,最好在财产之外进行验证。
user3163495 于 2024 年 4 月 25 日更新:该功能计划在 C# 13 / .NET 9 中使用。
链接:https://github.com/dotnet/csharplang/issues/140#issuecomment-1940720831
原答案:
我很惊讶没有人提到
field
关键字,这正是您所要求的(您在示例中将使用什么来代替 [backing field]
)。它本来应该随 C# 10 一起发布。现在看来它将随 C# 11 一起发布(?)
搜索字段关键字此处。
将验证放入 setter 中和/或确保构造函数设置有效/非空默认值。
或者使属性可为空,以提示客户他们必须考虑空值的可能性。
或者(但由于多种原因不太理想),将属性设为私有并添加访问它的方法。
强烈建议不要直接抛出异常。您或消费者有时会不喜欢结果。