我可以为 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。
注意:我知道如何 在不使用 的情况下使用自动实现的属性来完成此操作,但我想知道 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。