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