C#中能否实现Getter非可空、Setter可空的属性?
在C#中实现可空 backing field + 非可空Getter的属性
完全可以实现,你给出的代码本身就是正确的解决方案。
- 你的
Date1属性Getter返回非可空的DateTime,通过_date1 ?? Date2的兜底逻辑,确保外部获取该属性时永远不会拿到null,完美达成“向代码其他部分保证返回值不为空”的需求。 - 由于属性的公开类型是
DateTime(非可空),外部无法给Date1赋值null,这也是你代码里foo.Date1 = null;编译失败的原因,刚好符合预期。 - 内部的可空字段
_date1属于实现细节,外部代码无需感知,既保留了C#属性访问的便捷性,又满足了业务逻辑要求,完全不需要改用单独的方法。
示例代码
public class Foo(DateTime date2) { private DateTime? _date1; public DateTime Date1 { get => _date1 ?? Date2; set => _date1 = value; } public DateTime Date2 { get; } = date2; } var foo = new Foo(DateTime.Now) { Date1 = DateTime.Now.AddDays(1) }; foo.Date1 = null; // 编译不通过,符合预期
内容的提问来源于stack exchange,提问作者Calimero
相关产品推荐
相关产品推荐

