gpt4 book ai didi

c# - 我是否过度使用了可空类型?

转载 作者:太空狗 更新时间:2023-10-30 00:44:15 27 4
gpt4 key购买 nike

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


长版:

它工作得很好,我只是觉得我可能在滥用我可以使内容可为空的事实。

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

对于我的 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 中的每个字段都可以为 null,因为 EmployeeInsuranceRecords 进入一个通过 ID 链接的单独表,因此 Employee 可以在没有 EmployeeInsuranceRecord 的情况下存在(对于刚起步的人来说很常见,仍在最初的文书工作过程中)。通过从一开始就实例化 EmployeeInsuranceRecord,我可以通过不在那里实例化任何类来保持我的表示层更干净。考虑到我们正在处理的小规模,这对性能没有影响。

最佳答案

空值的一个烦恼是在取消引用/消耗值之前不断检查空值的编码开销——您可能需要使用一堆静态扩展方法来让您的生活更轻松。

但使用 null 比使用 DateTime.MinValue 等“神奇值”要好得多 - 这不仅会破坏数据,而且如果您忘记将其映射回 null,则在持久化到数据库时可能会造成问题。

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

关于c# - 我是否过度使用了可空类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8307483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com