如果我们这样声明财产:
public class Cat
{
public string Name { get; set; }
}
我们收到警告编译:
CS8618 - 不可空变量必须包含非空值 退出构造函数。考虑将其声明为可为空。
因为
Name
属性未初始化。
想象一下,这是强制性属性(业务规则是这么说的)。我们可以尝试通过多种方式来解决:
a) 直接导演:
public class Cat
{
public Cat()
{
Name = string.Empty;
}
public string Name { get; set; }
}
b) 在财产方面:
public class Cat
{
public string Name { get; set; } = string.Empty;
}
确实,这两个选项是相同的(语法糖)。
优点:我们可以像
Cat cat = new ();
一样使用类的init
缺点:属性在创建对象时由“虚拟”值初始化,并将被重写。或者(更主要)不会因某些未知原因而被重写(例如,我们使用自动映射器,并且源对象的该字段为空值,或者我们忘记映射该字段),并且结果对象将具有无效值(通过业务规则属性可以不能为空,猫必须有名字)
公开课猫 { 公共字符串?名称{获取;放; } }
对我来说,这是无效的方法(尽管它被描述为here作为替代方案),我们的业务规则说,
Name
是强制性的,如果没有这个属性,模型就不会有效(所以,在最好的条件下,它不应该甚至被创造)
required
关键字:公开课猫 { 公共必需的字符串名称 { get;放; } }
所以,它看起来是最好的(没有
Name
字段的显式初始化就无法创建类),但只是乍一看,因为它也是“语法糖”,仅用于编译。因此,当我们使用自动映射器映射属性时,我们面临同样的问题:可以在没有此属性的情况下映射对象(或使用源对象中的 null 值)。
因此,所有这些方法都只能掩盖问题(避免警告编译):可以使用假(默认)值创建对象!
有什么办法可以解决这个问题吗?
谢谢
如果属性不能为空,只需将其放入构造函数中,这样就不会出现警告并且必须使用有效值初始化类。
public class Cat
{
public Cat(string name)
{
Name = name;
}
public string Name { get; set; }
}