如何在Vb.net中检查两个对象是否相同

时间:2018-08-09 14:33:15

标签: asp.net vb.net oop object

我正在尝试与两个相同类型的对象进行比较,并确定它们是否相同。我有

  

objA IS objB

  

objA.Equals(objB)

但是每次我得到 false 时。这是我正在尝试的代码

Public Class RowsDetails    
  Property RelatedEmployee As String = String.Empty
    Property RelatedNumberAs String = String.Empty
    Property Type As String = String.Empty
    Property ReportType As String = String.Empty
    Property status As String = String.Empty
    Property Term As String = String.Empty
    Property Currency As String = String.Empty    

End Class

所有属性在objA和objB中具有相同的值。我已经阅读了一些有关实现 IEquatable(of T) 的文章。

但是它们大多看起来像自定义逻辑。 我想知道有没有简单的方法可以做到这一点?

先谢谢了。

3 个答案:

答案 0 :(得分:2)

每次比较两个对象时,都必须建立确定等效性的方法。

有3种主要的等效形式:

类型等效:使用TypeOf运算符完成。可以找到谁的行为here

引用等效项:使用is运算符完成。 found here

值相等(这似乎是您尝试做的事情)要求定义比较方法。否则,将通过使用默认的Equals()方法来做出最佳猜测。


如果这些都不适合您,那么您必须定义自己的比较方法。

除了实现IEquatable()或重载Equals()之外,唯一的其他方法是对两个对象进行哈希处理并进行比较。

答案 1 :(得分:1)

Object.Equals(Object)是您调用objA.Equals(objB)时所调用的。比较的是,它们是否指向同一个对象。

Dim objA as New RowDetails()
Dim objB = objA

现在它们都指向同一个对象。所以...

objA.Equals(objB)

返回True 但是在两者上都使用New关键字将创建2个不同的引用,因此它们与.Equals的默认实现不相等。

向您的RowDetails类添加以下内容。

Public Overrides Function Equals(obj As Object) As Boolean
        Dim rowDet As RowsDetails = TryCast(obj, RowsDetails)
        If rowDet Is Nothing Then
            Return False
            'The AndAlso will short circuit as soon as it finds a false
        ElseIf RelatedEmployee = rowDet.RelatedEmployee AndAlso RelatedNumber = rowDet.RelatedNumber AndAlso Type = rowDet.Type Then 'and the rest of the properties
            Return True
        End If
        Return False
End Function

答案 2 :(得分:0)

感谢您的更新。

我使用了.Equals()方法并比较了这些值。