首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ID比较与参考比较

ID比较与参考比较
EN

Stack Overflow用户
提问于 2012-10-01 14:19:40
回答 1查看 162关注 0票数 1

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

我更喜欢使用可能更可靠的引用比较,特别是对于尚未在DB上的对象。

在性能方面,Int32 ID比较和ByRef对象比较之间的差距是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-01 14:22:06

比较引用和比较int的性能将大致相同。ID比较需要对堆栈进行额外的属性访问调用。然而,两者之间的性能差异将是微不足道的。

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

为了更好地理解我的意思,请考虑下面的类作为示例:

代码语言:javascript
复制
 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类,如下所示:

代码语言:javascript
复制
 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等式也并不总是合适的。价值平等也不是。在这两种情况下,您都必须决定什么是最好的代表您正在操作的数据。有关这方面的更多信息,这篇文章提供了“实体”和“值对象”(来自领域驱动设计方法学的概念)之间区别的非常基本的概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12675096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档