比较值对象的相等性时如何处理空值?

Mar*_*ein 5 nhibernate null domain-driven-design equals value-objects

注意:我以 C# 为例,但在 Java 和许多其他语言中问题几乎相同。

假设您实现了一个值对象(如M. Fowler 的值对象模式)并且它有一些可为空的字段:

class MyValueObject
{   
    // Nullable field (with public access to keep the example short):
    public string MyField;
}
Run Code Online (Sandbox Code Playgroud)

然后,当覆盖 Equals() 时,您如何处理两个值对象的 MyField 都设置为 null 的情况?它们是否相等?

在 C# 中,平等对待它们似乎很明显,因为:

  1. 这是当您使用 C# 结构而不是类并且不覆盖 Equals() 时 Equals() 的行为。

  2. 以下表达式为真:

    null == null
    object.ReferenceEquals(null, null)
    object.Equals(null, null)
    
    Run Code Online (Sandbox Code Playgroud)

然而,在 SQL 中(至少在 SQL Server 的方言中),NULL = NULL是假的,反之则NULL is NULL是真的。

我想知道在使用 O/R 映射器(在我的例子中是 NHibernate)时需要什么样的实现。如果你实现了“自然”的 C# 相等语义,当 O/R 映射器将它们映射到数据库时会不会有任何不良影响?

或者也许允许值对象中的可为空字段无论如何都是错误的?

Pro*_*ude 0

我个人认为,如果它可以为空(在无错误代码中),那么它们应该被视为相等。但是,如果它不应该为空(即:客户的姓名或送货的街道地址),那么它首先就不应该为空。