IEquatable(Of T).Equals的建议命名约定?

时间:2013-01-17 15:07:50

标签: vb.net iequatable

如果我在我的类上实现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?因为坦率地说,那是相当丑陋的。

2 个答案:

答案 0 :(得分:2)

您应该可以将其命名为Equals();这只会使Equals(Object)方法超载 您可能需要添加Overloads关键字。

答案 1 :(得分:2)

定义一个与基本类型方法同名的方法,但不同的签名可以有两种不同的效果:

  1. 它可能使基类型方法无法通过派生类型访问,因此只会考虑派生类型中的定义。
  2. 它可以将新方法定义添加到从基类型导入的定义列表中。

在某些情况下,第一个选项是正确的,有些情况下第二个选项是正确的。而不是猜测应该使用哪个选项,VB.NET要求在创建与基本类型函数同名但具有不同签名的函数时,程序员必须使用Shadows关键字来指定第一个行为,或Overloads关键字指定第二个。

虽然Microsoft使用公共方法自动生成接口实现,但在某些情况下,人们可能希望只通过接口提供方法。因为VB允许独立于实现的接口成员的名称来指定函数的名称,所以可以使接口成员只能通过实现来访问它,使其成为私有的,并给它任何不会与其他任何东西冲突的名称。在类本身中使用 (如果该方法是私有的,与派生类成员的冲突将不是问题。)

选择一个任意的非冲突名称,同时将声明保留为公共可能几乎从来都不是正确的行动[应该将声明更改为私有,将声明更改为Protected Overridable并将名称更改为某些内容更好(例如SomeMember_Impl),或者更改名称以匹配接口成员,并根据需要添加OverloadsShadows关键字。对于IEquatable(Of T).EqualsOverloads关键字可能是最佳方法。

顺便说一下,IEquatable(Of T)通常只能通过密封类(或固有密封的结构)来实现。它可以在应用于结构时提供很大的性能提升(每次使用时都会保存装箱操作),并且在应用于密封类时可以获得小的性能提升(不需要检查其操作数的类型)。当应用于未密封的类型时,很难确保对于所有派生类型,IEquatable(Of T).Equals(T)的语义将与Equals(Object)的语义匹配,除非将前一个方法链链接到后者。这样的链接会否定通过首先实施IEquatable(Of T)可能获得的任何性能优势。