Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个对象,查看它们在VB.NET中是否兼容_Vb.net - Fatal编程技术网

比较两个对象,查看它们在VB.NET中是否兼容

比较两个对象,查看它们在VB.NET中是否兼容,vb.net,Vb.net,我想测试这两个对象的值是否可以比较 例如,如果我将一个变量定义为一个包含值“a”的对象,将另一个变量定义为一个值为0的对象。(这些必须定义为类型对象。) 当我做一个简单的比较时,如果Object1 Object2,那么,等等,我会得到一个错误。 那么我如何测试这些对象是否具有可比性呢?我看过TryCast、DirectCast、Ctype等,但看不出它们有什么帮助 任何建议。您希望在课堂上实现 方法就是神奇发生的地方。您希望在类中实现 方法就是魔法发生的地方。如果你只是想检查它们是否是同一类型,

我想测试这两个对象的值是否可以比较

例如,如果我将一个变量定义为一个包含值“a”的对象,将另一个变量定义为一个值为0的对象。(这些必须定义为类型对象。)

当我做一个简单的比较时,
如果Object1 Object2,那么,
等等,我会得到一个错误。 那么我如何测试这些对象是否具有可比性呢?我看过TryCast、DirectCast、Ctype等,但看不出它们有什么帮助

任何建议。

您希望在课堂上实现

方法就是神奇发生的地方。

您希望在类中实现


方法就是魔法发生的地方。

如果你只是想检查它们是否是同一类型,那么我认为你可以这样做:

If Object1.GetType is Object2.GetTypeThen
    ...
End If

如果你只是想看看它们是否是同一类型的,那么我认为你可以这样做:

If Object1.GetType is Object2.GetTypeThen
    ...
End If

定义类时,应该使用ICompare和IComparable接口。

定义类时,应该使用ICompare和IComparable接口。

另一种方法是重载GetHashCode方法,为对象返回复合键,然后比较Object1.GetHashCode和Object2.GetHashCode。 但实际上,我会(如其他答案中所述)实现IComparable(Of T)

编辑--添加了示例代码

Public Class MyClassA

    Private _myVariable As String = String.Empty
    Public Property MyProperty() As String
        Get
            Return "Fooey"
        End Get
        Set(ByVal value As String)
            _myVariable = value
        End Set
    End Property

    Public Overloads Overrides Function GetHashCode() As Integer
        Return MyProperty.GetHashCode
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return (Me.GetHashCode = obj.GetHashCode)
    End Function

End Class

Public Class MyClassB

    Private _myVariable As String = String.Empty
    Public Property MyProperty() As String
        Get
            Return "Fooey"
        End Get
        Set(ByVal value As String)
            _myVariable = value
        End Set
    End Property

    Public Overloads Overrides Function GetHashCode() As Integer
        Return MyProperty.GetHashCode
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return (Me.GetHashCode = obj.GetHashCode)
    End Function

End Class
因为您已经重写(并重载以返回所需的类型)Equals运算符,并且在其中使用了overidden GetHashCode方法,所以您可以这样做

If MyClassA.Equals(MyClassB) ......
然后,您所要做的就是决定在GetHashCode方法中放入什么,该方法允许您将一个对象与另一个对象(复合键)进行比较


希望这有帮助。

另一种方法是重载GetHashCode方法,为对象返回复合键,然后比较Object1.GetHashCode和Object2.GetHashCode。 但实际上,我会(如其他答案中所述)实现IComparable(Of T)

编辑--添加了示例代码

Public Class MyClassA

    Private _myVariable As String = String.Empty
    Public Property MyProperty() As String
        Get
            Return "Fooey"
        End Get
        Set(ByVal value As String)
            _myVariable = value
        End Set
    End Property

    Public Overloads Overrides Function GetHashCode() As Integer
        Return MyProperty.GetHashCode
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return (Me.GetHashCode = obj.GetHashCode)
    End Function

End Class

Public Class MyClassB

    Private _myVariable As String = String.Empty
    Public Property MyProperty() As String
        Get
            Return "Fooey"
        End Get
        Set(ByVal value As String)
            _myVariable = value
        End Set
    End Property

    Public Overloads Overrides Function GetHashCode() As Integer
        Return MyProperty.GetHashCode
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return (Me.GetHashCode = obj.GetHashCode)
    End Function

End Class
因为您已经重写(并重载以返回所需的类型)Equals运算符,并且在其中使用了overidden GetHashCode方法,所以您可以这样做

If MyClassA.Equals(MyClassB) ......
然后,您所要做的就是决定在GetHashCode方法中放入什么,该方法允许您将一个对象与另一个对象(复合键)进行比较


希望这有帮助。

您可以使用该方法测试类型兼容性。当然,这是关于可转让性而不是可比性的,但我想这是最接近的


FWIW,我宁愿尝试解决您的要求,即两种类型都是
对象
。您难道不能使用其他一些提供可比性机制的公共基类型吗?仅向问题抛出普通的
对象
s听起来像是设计问题,并且有明显的代码气味。

您可以使用该方法测试类型兼容性。当然,这是关于可转让性而不是可比性的,但我想这是最接近的


FWIW,我宁愿尝试解决您的要求,即两种类型都是
对象
。您难道不能使用其他一些提供可比性机制的公共基类型吗?仅向问题抛出普通的
对象
s听起来像是设计问题,并且具有明显的代码气味。

是gethashcode,仅等于比较引用,而不是比较值。试试iQualityComparer。
希望此帮助是,gethashcode,仅等于比较参考,而不是比较值。试试iQualityComparer。
希望这对你有所帮助

谢谢你的回复。我试过了,如果这两个对象的类型不同,我会出错。谢谢你的回复。我试过了,如果这两个对象的类型不同,我会出错。谢谢你的回复。这会比较两种类型,但不会告诉我不同类型是否具有可比性。例如,int16和int64是不同的类型,但具有可比性。感谢您的回复。这会比较两种类型,但不会告诉我不同类型是否具有可比性。例如,int16和int64是不同的类型,但具有可比性。谢谢,有机会获得一些示例代码。我正在努力解决这个问题。RegardsHow是否有任何帮助除了你的代码没有编译(
GetHashCode
返回一个
整数,而不是
字符串,并且你的
Equals
方法被破坏)之外,我已经更改了代码,它确实在我的代码上编译了,因为我没有严格的选项(但我没有尝试)。这将允许他比较两个对象。不幸的是,您的编辑无法使此代码正常工作。如何做到这一点?我试过了——如果MyIntancedClassA.Equals(MyInstancedClassB),那么MessageBox.Show(“相同”)或者MessageBox.Show(“不同”)。。。它工作得很好。按原样运行,它将显示“Same”,更改其中一个属性以返回不同的“Fooey2”,它将显示“different”,谢谢,有没有可能获得一些示例代码。我正在努力解决这个问题。RegardsHow是否有任何帮助除了你的代码没有编译(
GetHashCode
返回一个
整数,而不是
字符串,并且你的
Equals
方法被破坏)之外,我已经更改了代码,它确实在我的代码上编译了,因为我没有严格的选项(但我没有尝试)。这将允许他比较两个对象。不幸的是,您的编辑无法使此代码正常工作。如何做到这一点?我试过了——如果MyIntancedClassA.Equals(MyInstancedClassB),那么MessageBox.Show(“相同”)或者MessageBox.Show(“不同”)。。。它工作得很好。按原样运行,它将显示“相同”,更改其中一个属性以返回不同的“Fooey2”,它将显示“不同”