1

我有一些实体框架对象,它们也由它们自己的 ID 标识。

我更喜欢使用可能更可靠的参考比较,尤其是对于尚未在数据库中的对象。

Int32 ID 比较ByRef 对象比较在性能方面有哪些差距?

4

1 回答 1

1

比较参考和比较的性能int大致相同。比较ID需要对堆栈进行额外的属性访问调用。但是,两者之间的性能差异可以忽略不计。

但是,这不应该是您如何确定平等的决定因素。平等应根据对象所代表的内容来确定。如果对象是由它的ID属性定义的,那么ID应该使用该属性来确定相等性。如果对象是由其值的组合定义的,那么您应该通过比较它的每个组件值来确定相等性。

为了更好地理解我在说什么,以下面的类为例:

 public class Lady { 
      public Lady(int id, string name, bool isMarried){
          this.ID = id;
          this.Name = name;
      }
      public int ID { get; private set; }
      public string Name { get; set; }

      public override int Equals(object other){  /* What goes here? */ }
      public override int GetHashCode(){  /* What goes here? */ }
 }

想象一下,您的应用程序使用如下Lady类:

 void Main(){
      var JaneSmith = new Lady(id:12,name:"Jane Smith");
      var JaneSmithJones = new Lady(id:12,name:"Jane Smith-Jones");
 }

在这种情况下,这两个对象实际上可能指的是同一个人。也许JaneSmith是在简结婚并改名之前创建和缓存的。但是,现在她的名字已经改变了,现在值和引用比较都将失败。但是,如果我们使用 ID 相等,那么这没关系,因为我们会知道它们应该指的是同一个人(和同一数据源)。Lady然后,我们可以通过放弃两个实例并从数据库重新加载来确定哪个实例当前是Lady正确ID == 12的。相比之下,如果我们使用引用相等或值相等,我们最终会保存两个对象,可能会覆盖错误的数据。此外,即使两个实例中的数据相同,并且我们只有两个实例,因为我们不小心加载了JaneSmith从数据库中两次,引用相等性检查将返回 false。这似乎不太正确,new Lady(12,"Jane").Equals(new Lady(12,"Jane"))应该返回 false。它还使缓存几乎不可能,因为您永远无法确定记录是否已被缓存

一般来说,使用引用相等来比较持久对象是一个坏主意。然而,ID平等也不总是合适的。价值平等也不是。两种情况都有,你必须决定什么最能代表你正在处理的数据。有关这方面的更多信息,本文提供了“实体”和“值对象”之间差异的一个非常基本的概念(来自领域驱动设计方法的概念)。

于 2012-10-01T14:22:06.083 回答