比较两种不同类型对象的正确方法

时间:2015-01-26 10:14:55

标签: c# equality

我正在使用包含服务的lib,该服务通知何时在另一个应用程序中创建或删除对象。这些对象属于A类,其中包含我在应用程序中不需要的大量信息。

所以在我的应用程序中,我创建了一个类型B,它是一个轻量级的A类型。当我收到服务通知已删除对象A时,我必须将类型A中已删除的项目与我的类型B匹配,以删除正确的对象。

我应该覆盖类型B Equals方法并编写如下内容:

public override bool Equals(object obj) {
    if (base.Equals(obj)) return true; //check for reference
    B lightweightObj = obj as B;

    if (alarm == null) {
        A objFromService = obj as A;
        if (objFromService == null) return false;
        return objFromService.Class == this.ClassId &&
                objFromService.Group == this.GroupId &&
                objFromService.Name.Equals(this.Name) &&
                objFromService.Time == this.Time &&
                objFromService.Projectname.Equals(this.Project.Project.Name);
    } else {
        return lightweightObj.ClassId == this.ClassId &&
               lightweightObj.GroupId == this.GroupId &&
               lightweightObj.Name.Equals(this.Name) &&
               lightweightObj.Time == this.Time &&
               lightweightObj.Project == this.Project;
    }
}

或者我应该创建一个简单的函数来获取参数中的A类型对象并返回一个布尔值?

我希望能够做到这样的事情:

B matchingBObject = MyObjects.FirstOrDefault(a => a.Equals(args.TheAObject));
if(matchingBObject != null) {
    MyObjects.Remove(matchingBObject);
}

Equals函数是否只比较两个相同类型的对象,或者是否可以比较两种不相关的类型?

1 个答案:

答案 0 :(得分:1)

你绝对不应该这样做。相反,正如您所建议的那样,您应该将此逻辑作为单独的方法编写。

至少,像这样的代码会让人感到困惑,这会导致错误,通常很难解决的错误,因为没有其他人看到代码(或者你在六个月内)会猜到有人会做类似的事情此

更有问题的是,由于大多数人都理解平等的概念,因此它是反身的。也就是说,如果对象A等于对象B,则对象B等于对象。但是,如果你设置这样的覆盖,那将是不正确的。相反,即使a.Equals(b)trueb.Equals(a)也可能不会。{/ p>

同样,至少这令人困惑。但是,如果您最终尝试在哈希表中使用这种实现或尝试在列表或其他集合中查找元素,那就更糟了。这些是假设和依赖平等的反身性质的场景,而上述代码甚至根本不起作用。

请为了你自己的理智和他人的理智,只需写一个常规的方法来做出这个决定,例如LightweightMatchesServiceObject()或类似的东西清楚易懂。