我对nullable reference type system可用的正弦C#8有疑问。
假设我们有一个C#域模型类,它具有如下所示的可变引用类型属性:
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
到目前为止没有问题。但考虑到现实世界的情况,我经常要检查属性的有效性,因为它是一个公共可变属性,因此我必须确保每当属性更改时模型不变。
public class Person
{
private string _name;
public string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException("Name is required.");
}
public Person(string name)
{
Name = name;
}
}
然后编译器生成CS8618警告,基本上是这样
“非空字段_name未初始化。请考虑声明字段作为可空类型。“
因此,每次遇到警告时,我都必须使用以下pragma指令将构造函数括起来。
#pragma warning disable CS8618
public Person(string name)
{
Name = name;
}
#pragma warning restore CS8618
但是我认为总是这样做是多余和乏味的。我是在滥用某些东西,还是有更好的方式编写此类属性而没有警告?
基于this:
初始化字段的警告问:为什么对于由构造函数间接初始化或在构造函数外部初始化的字段报告警告?
A:编译器识别当前字段中明确分配的字段仅构造函数,并警告声明为不可为空的其他字段。这忽略了字段初始化的其他方式,例如工厂方法,辅助方法,属性设置器和对象初始化器。我们将调查识别常见的初始化模式以避免不必要的警告。
因此,到目前为止,将分配直接移到构造函数中是唯一可能的方法。并且可以肯定的是,对于此IMO使用pragma指令似乎还不错。