如果我在我的类上实现IEquatable(Of T)
并让Visual Studio(2010)自动生成所需的Equals
方法,我就明白了:
Public Function Equals1(ByVal other As Foo) As Boolean _
Implements System.IEquatable(Of Foo).Equals
End Function
由于与Object.Equals的命名冲突,请注意额外的1
。是否有任何约定/建议用于命名此函数而不是Equals1
?因为坦率地说,那是相当丑陋的。
答案 0 :(得分:2)
您应该可以将其命名为Equals()
;这只会使Equals(Object)
方法超载
您可能需要添加Overloads
关键字。
答案 1 :(得分:2)
定义一个与基本类型方法同名的方法,但不同的签名可以有两种不同的效果:
在某些情况下,第一个选项是正确的,有些情况下第二个选项是正确的。而不是猜测应该使用哪个选项,VB.NET要求在创建与基本类型函数同名但具有不同签名的函数时,程序员必须使用Shadows
关键字来指定第一个行为,或Overloads
关键字指定第二个。
虽然Microsoft使用公共方法自动生成接口实现,但在某些情况下,人们可能希望只通过接口提供方法。因为VB允许独立于实现的接口成员的名称来指定函数的名称,所以可以使接口成员只能通过实现来访问它,使其成为私有的,并给它任何不会与其他任何东西冲突的名称。在类本身中使用 (如果该方法是私有的,与派生类成员的冲突将不是问题。)
选择一个任意的非冲突名称,同时将声明保留为公共可能几乎从来都不是正确的行动[应该将声明更改为私有,将声明更改为Protected Overridable
并将名称更改为某些内容更好(例如SomeMember_Impl
),或者更改名称以匹配接口成员,并根据需要添加Overloads
或Shadows
关键字。对于IEquatable(Of T).Equals
,Overloads
关键字可能是最佳方法。
顺便说一下,IEquatable(Of T)
通常只能通过密封类(或固有密封的结构)来实现。它可以在应用于结构时提供很大的性能提升(每次使用时都会保存装箱操作),并且在应用于密封类时可以获得小的性能提升(不需要检查其操作数的类型)。当应用于未密封的类型时,很难确保对于所有派生类型,IEquatable(Of T).Equals(T)
的语义将与Equals(Object)
的语义匹配,除非将前一个方法链链接到后者。这样的链接会否定通过首先实施IEquatable(Of T)
可能获得的任何性能优势。