c# - "valuetype?"属性的 getter 和 setter 可以有不同的返回类型吗?

标签 c#

例如,我有一个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/

相关文章:

c# - 打开 XML 段落间距

C# 日期时间 ISO 8601 格式给出不正确的值

c# - MySql.Net 连接 :

c# - 如何将 C# Azure Function App 添加到 Azure 资源组项目以进行部署

c# - 在 ASP.NET 应用程序启动时显示 stub 页面

c# - Novacode Docx 从位图创建图像

c# - 平台调用语句中 DLL 的相对路径

c# - ZIP 文件的 EOF 标记是什么?

c# - 模拟 IDataReader 扩展方法

c# - 在 LINQ 中按百分比分组