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