例如,我有一个int?名为 Foo 的属性,我希望 getter 返回 int?,setter 返回 int(以禁止在编译时从外部进行 null 赋值),如下所示:
private int? foo;
public int? Foo {
get {
return foo;
}
}
public int Foo {
set {
foo = value;
}
}
上面的代码无法编译,但我认为以这种方式使用访问器是有意义的。我想知道 C# 是否支持这样的用例。否则,我将必须在运行时检查 setter 中分配的值是否不为 null,或者通过添加一对方法 GetFoo 和 SetFoo 来解决。
最佳答案
如果只拥有一个属性,您可以简单地编写:
public int? Foo
{
get => _Foo;
set
{
if ( !_Foo.Equals(value) )
_Foo = value.HasValue ? value : throw new NoNullAllowedException();
}
}
private int? _Foo;
或者按照@SomeBody的建议使用专用的setter来确保编译时不为空:
public int? Foo => _Foo;
private int? _Foo;
public void SetFoo(int value) => _Foo = value;
大多数人会更喜欢最后一个选项。
同样要同质:
private int? _Foo;
public int? GetFoo() => _Foo;
public void SetFoo(int value) => _Foo = value;
但是,如果您需要创建实体,使用序列化或一些流式传输(如 JSON 帮助程序)以及 Visual Studio 设计器或运行时属性编辑器,或任何需要完整真实读写属性(如 ORM)的内容,那么第一个是被使用。
因此该类的实例可以从内部删除字段的数据,但其他工件无法将该属性设置为 null,只需查看它是否为 null。
如果子类可以做到这一点,请将字段设置为 protected。
如果程序集中的其他类以及此程序集中的子类可以执行此操作,请将字段设置为内部。
如果程序集中的其他类以及任何程序集中的子类都可以执行此操作,请将字段设置为 protected 内部。
备注:_Foo初始值为null。
关于c# - "valuetype?"属性的 getter 和 setter 可以有不同的返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67481383/