2016-01-06 75 views
0

我创造了这样一个类:如何为自己的类定义'='?

Public Class WorkDay    

    <JsonProperty("start")> 
    Public Property starttime As String = Nothing 
    <JsonProperty("end")> 
    Public Property endtime As String = Nothing 
    Public Property breaks As New List(Of Break) 

End Class 

现在我需要比较这个类的一个对象,比如这个:

Dim working_plan = JsonConvert.DeserializeObject(Of Dictionary(Of String, WorkDay))(wp) 
Dim DayNames = {"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"} 
Dim this_day = working_plan(day) 

If this_day = Nothing Then 
    ... 

现在this_dayWorkDay类的对象,所以当我尝试比较没什么,我得到:

运算符=未定义为WorkDay类型。

我应该在我自己的类中定义运算符?我该怎么做?

+2

坏主意!如果你想重写'='运算符只用于比较'Nothing',那么使用'Is Nothing'或'IsNot Nothing'。 @ Alex的回答包含了这一点,但我想提到在这种情况下重写不会好似 – Fabio

回答

4

编辑:编辑说我应该回答问题前,请仔细阅读问题;) 要检查的对象是否是无你必须使用Is repsective IsNot关键词:

If this_day Is Nothing Then 

所属:

If this_day IsNot Nothing Then 

融为一体原来的答复配对不属于任何对象:

超载平等运营商在你的工作日类:

Public Shared Operator =(x As WorkDay, y As WorkDay) 
     'Code to determine whetther x equals y 
End Operator 

要知道,你还必须重载不等于操作:

Public Shared Operator <>(x As WorkDay, y As WorkDay) 
     'Code to determine whetther x not equals y 
End Operator 

对马格努斯的评论:

Public Overrides Function Equals(obj As Object) As Boolean 
    Dim o As WorkDay = TryCast(obj, WorkDay) 
    If o IsNot Nothing Then 
     'check whether o equals Me 
    Else 
     Return False 
    End If 
End Function 

Public Overrides Function GetHashCode() As Integer 
    'return a feasible hashcode of a member of Me e.g. 
    Return Me.StartTime.GetHashCode() XOR Me.EndTime.GetHashCode() 
End Function 
+2

重写'Equals'和'GetHashCode'也是一个好主意。 – Magnus

+0

我不知道这种做法,谢谢:)无论如何,当我插入这个函数时,我得到了两个函数:operator =不会为所有代码路径返回任何值 – Dillinger

+0

关于@Magnus评论:覆盖'Equals'和'在这种情况下,GetHashCode是**强制**。 – Fabio

相关问题