c# – 我是否过度使用Nullable类型?

我将所有字段设置为可空类型,其中它们对应的后端数据库字段允许空值.好?坏?

长版:

它工作得很好,我只是觉得我可能会滥用我可以使东西可以为空的事实.

基本上,它是一个与我们的SQL数据库相关联的员工管理的内部应用程序.我使用的是三层结构,从演示到后端:Business Objects – >业务逻辑 – >数据访问.

对于我的Employee对象,我有以下字段:

    public class Employee : Person
    {
       private EmployeeTitle? _employeeTitle = null;  //enum
       private EmployeeType _employeeType;  //enum
       private DateTime _startDate;
       private DateTime? _endDate = null;
       private EmployeeInsuranceRecord _employeeInsuranceRecord = new EmployeeInsuranceRecord();

       //...
    }

    public class EmployeeInsuranceRecord
    {
       private int? _employeeInsuranceRecordID = null;
       private string _alienRegistrationNumber = null;
       private string _healthInsuranceNumber = null;
       private string _unemploymentInsuranceNumber = null;
       private string _welfarePensionNumber = null;
       private DateTime? _insuranceAcquiredDate = null;

       //...
    }

在我的数据库中:

> EmployeeTitleID允许空值.例如,员工可以在试用期内开始,没有固定的职位.
> EmployeeTypeID不允许空值.即使员工是客人或试用期,也必须明确选择这一点以用于记录目的.
> StartDate不允许空值.如果有人进入数据库,我们需要知道他们何时开始.
>然而,EndDate确实允许空值.目前受雇的任何人还没有EndDate.
>我在Employee实例化上实例化一个EmployeeInsuranceRecord对象,但EmployeeInsuranceRecord中的每个字段都可以为空,因为EmployeeInsuranceRecords进入一个通过ID链接的单独表,因此Employee可以在没有EmployeeInsuranceRecord的情况下存在(对于刚刚开始的人来说,仍然在最初的文书工作中很常见)处理).通过从一开始就实例化EmployeeInsuranceRecord,我可以通过不在那里实例化任何类来保持我的表示层更清晰.考虑到我们正在进行的小规模,这对性能没有影响.

解决方法:

null的一个烦恼是在取消引用/消耗值之前继续检查null的编码开销 – 您可能需要使用一堆静态扩展方法来使您的生活更轻松.

但是使用null比使用像DateTime.MinValue这样的“魔术值”更好 – 这不仅会破坏数据,而且如果您忘记将其映射回null,则在持久保存到数据库时可能会出现问题.

如您所述,某些值成为强制性的,因为它们是“状态”依赖的(例如,当员工辞职/退休/被解雇时需要EndDate).您需要根据此分割出验证策略.

上一篇:Java并发编程(五)锁的使用(下)


下一篇:c# – 为什么我可以将null赋给Type“struct Nullable”的值,但不能分配给我的struct?