1

如果我IEquatable(Of T)在我的类上实现并让 Visual Studio (2010) 自动生成所需的Equals方法,我会得到:

Public Function Equals1(ByVal other As Foo) As Boolean _
  Implements System.IEquatable(Of Foo).Equals

End Function

1由于与 Object.Equals 的命名冲突,请注意额外的必要性。是否有任何约定/建议可以将此函数命名为除 之外的其他名称Equals1?因为坦率地说,这很丑陋。

4

2 回答 2

2

你应该能够命名它Equals();这只会重载该Equals(Object)方法。
您可能需要添加Overloads关键字。

于 2013-01-17T15:09:28.617 回答
2

定义一个与基类型方法同名但签名不同的方法会产生两种不同的效果:

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

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

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

选择一个任意不冲突的名称,同时将声明保留为公共可能几乎从来都不是正确的做法[人们应该将声明更改为私有,将声明Protected Overridable更改为并将名称更改为更好的名称(例如SomeMember_Impl),或者更改与接口成员匹配的名称,并根据需要添加OverloadsorShadows关键字。在 的情况下IEquatable(Of T).EqualsOverloads关键字可能是最好的方法。

Incidentally, IEquatable(Of T) should generally only be implemented by sealed classes (or structures, which are inherently sealed). It can provide a big performance win when applied to structures (it saves a boxing operation every time it's used), and a small performance win when applied to sealed classes (there's no need to check the type of its operand). When applied to unsealed types, it's difficult to ensure that for all derivative types the semantics of IEquatable(Of T).Equals(T) will match those of Equals(Object) except by having the former method chain to the latter. Such chaining would negate any performance advantage that could have been gained by implementing IEquatable(Of T) in the first place.

于 2013-04-04T15:15:56.133 回答