【问题标题】:How to shadow Object.Equals() method in a Module?如何在模块中隐藏 Object.Equals() 方法?
【发布时间】:2016-07-10 01:51:36
【问题描述】:

也许问题的标题不正确,因为模块中的方法不能被隐藏,但本质上我想隐藏一个再次声明它的基成员,并隐藏它而不失去调用它并返回的机会正确的值。

我通常为班级这样做:

<EditorBrowsable(EditorBrowsableState.Never)>
Public Shadows Function Equals(ByVal obj As Object) As Boolean
    Return MyBase.Equals(obj)
End Function

这适用于结构:

<EditorBrowsable(EditorBrowsableState.Never)>
Public Shadows Function Equals(ByVal obj As Object) As Boolean
    Return Object.Equals(obj, Me)
End Function

我发现尝试使用模块重现此行为的问题是我应该使用以下示例中的疑问参数来填充,因为我不能使用 Me、模块名称或构造函数,我明白了,但那我需要用什么?

Module TestModule

    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Function Equals(ByVal obj As Object) As Boolean
        Return Object.Equals(obj, ?)
    End Function

End Module

【问题讨论】:

  • 如果您调用标准 Object.Equals,这将起到什么作用?
  • @Plutonix 感谢您的评论。原因只是为了设计,我非常反复无常地设计类,我喜欢看到我的类的 Intellisense 自动完成框没有我在大多数情况下永远不会使用的基本方法,例如 Equals 或 ReferenceEquals,我将它们隐藏起来以进行设计,但我不想失去调用它们以提高效率的能力。
  • 我不知道这是否有帮助,但 VB 模块概念几乎是 IDE 强制执行的概念。如果您将&lt;Microsoft.VisualBasic.CompilerServices.StandardModule&gt; 应用于不属于当前解决方案的类库 (dll) 中的类,您将看到其 Shared 成员看起来就像它们在 VB 模块中一样。

标签: .net vb.net module equality shadowing


【解决方案1】:

这是有规则的……只是你不能。

您只能在班级级别使用Shadows。这意味着 Shadows 元素的声明上下文必须是类,不能是源文件、命名空间、接口、模块、结构或过程。

这就是为什么你可以在结构和类中...

请查看更多here。在底部,它说明了阴影可以存在的上下文。

编辑 - 解决方案

当您可以使用标准的创建您自己的函数来确定这两个对象是否为相等。

这里有一个简单的解决方案,您可以使用它尝试和测试。此外,如果您想将Equals 用于许多对象,那么您将需要更多的结构来比较您所比较的对象,这会影响Equals 函数。

Module TestModule


    Sub Main()
        Dim a As New Person("Stack", "Overflow")
        Dim b As New Person("Stack", "Overflow")

        Console.WriteLine(a.Equals(b))

    End Sub

    Public Structure Person
        Private FirstName As String
        Private LastName As String

        Public Sub New(firstName As String, lastName As String)
            Me.FirstName = firstName
            Me.LastName = lastName
        End Sub

        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Function Equals(ByVal obj As Object) As String
            Return If(Object.Equals(obj, Me), "TRUE", "FALSE").ToString
        End Function
    End Structure

End Module

现在您当然可能想知道为什么Equals 返回String,我故意这样做是为了让您可以看到它确实会影响基类,因为我返回的是不同的类型,否则您不能。您可以更改该函数以返回 Boolean 并更改返回值,它工作得很好。

【讨论】:

  • 感谢您的帮助,但向模块添加结构(在我的情况下将是空的且没有目的的结构)并不是我的想法。目前我正在模拟模块级别的阴影,只是声明名为“Equals”的函数,但我有点不明白我需要以什么方式调用内部的 Object.Equals()(第二个参数,应该成为模块)。我将尝试检查在线 .Net Framework 参考,以尝试发现 Microsoft 调用 Object.Equals 将对象与模块进行比较的第二个参数。真的很感谢!
【解决方案2】:

在 Object 中定义的这个函数似乎是您要隐藏的函数:

Public Overridable Function Equals (obj As Object) As Boolean

但是,这在模块中不存在。在您的模块名称是共享名称之后,您看到 Intellisense 建议的“等于”:

Public Shared Function Equals (objA As Object, objB As Object) As Boolean

您可以在documentation 中看到它们单独列出。要停止 Intellisense 的建议,只需将其包含在您的模块中即可:

<EditorBrowsable(EditorBrowsableState.Never)> _
Public Function Equals(objA As Object, objB As Object) As Boolean
    Return Object.Equals(objA, objB)
End Function

这似乎不是很好的设计

【讨论】:

  • 我刚刚升级到 Visual Studio 2015,现在我的问题似乎变得毫无意义,因为在这个新的 IDE 中,现在 Intellisense 没有在模块中显示 Equals 和 ReferenceEquals 方法(也许他们注意到这些方法在模块中有任何意义),所以我现在不必隐藏任何东西来隐藏它们......
  • 我无法回到 VS2013 来验证您所说的关于共享功能的内容,我不太相信我一直在试图掩盖错误的方法,多么如果是这种情况,我就失败了,因为没有正确注意到方法签名的差异,无论如何......我无法验证它,但可能是真的,那么我就接受你的回答。谢谢。
  • @ElektroStudios 很想解释一下这是如何解决您的问题的,我很好奇。您接受的答案仍然缺少有关为什么不能像我解释的那样的详细信息...
猜你喜欢
  • 2013-07-23
  • 2015-05-10
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2013-01-25
  • 2015-12-12
  • 2021-11-25
  • 2021-02-06
相关资源
最近更新 更多