【问题标题】:VB.NET namespace and class syntaxVB.NET 命名空间和类语法
【发布时间】:2011-07-31 18:27:16
【问题描述】:

我在下面的代码中遗漏了什么?也许是范围问题?语法问题?

我在我的 VB.NET 项目中添加了一个新文件 class1.vb,其中包含:

Namespace MyFunc1
    Public Class MyFunc2

        Public Function Add(ByVal n1 As Int16, ByVal n2 As Int16) As Int16
            return n1 + n2  ' Edited from: "Add = n1 + n2" (same thing)
        End Function

    End Class
End Namespace

回到我的form1.vb,这接近顶部:

Imports MyCode.MyFunc1  ' A handful of generic functions

在 form1.vb 中,我认为我曾经能够通过以下方式调用我的函数:

n = MyFunc1.Add(15, 16)

错误提示“它不是成员”。 这些也不能按预期工作:

n = MyFunc2.Add(15, 16)
n = MyFunc1.MyFunc2.Add(15, 16)
n = Add(15, 16)

我确信,这曾经有效:

n = MyFunc1.Add(15, 16)

【问题讨论】:

  • Susan 你的问题已经回答了吗?如果有,请您接受您认为最能解决您的问题的答案。

标签: vb.net class syntax visual-studio-2005 namespaces


【解决方案1】:

为了以您想要的方式执行此操作,您要么需要按照@Chipmunk 的建议创建类的实例,要么将方法设为 Shared。您还应该摆脱旧的 VB6 方法。您的方法应如下所示:

Public Shared Function Add(ByVal n1 As Int16, ByVal n2 As Int16) As Int16
    Return n1 + n2
End Function

编辑:
然后将使用以下方法调用:

Dim x as Int16 = MyFunc1.MyFunc2.Add(15, 16)

使用Call 假设您正在执行子程序而不是函数。函数的目的是返回数据。只是Calling 不会产生预期的效果。

编辑 2(示例)

您可以使用 @Chipmunk 声明的模块,也可以使用类。我的偏好只是课堂,因为 MS 还没有对模块下定决心(他们在其中一个版本中取消了它们 - 我忘记了 - 然后又把它们带回来了)。

类方法

Namespace MyFunc1
    Public Class MyFunc2

        Public Shared Function Add(ByVal n1 As Int16, ByVal n2 As Int16) As Int16
            Return n1 + n2    
        End Function

    End Class
End Namespace

Form1.vb 中的用法

Imports MyFunc1

...

Public Sub DoAdd()
    Dim x as Int16 = MyFunc2.Add(15, 16)  ' MyFunc1 Namespace imported, MyFunc2
                                          ' is assumed. No instance is created
End Sub

模块方法

Public Module MyFunctions

    ' Notice no shared modifier here. The module uses the legacy module
    ' concept to assume that it is shared
    Public Function Add(ByVal n1 as Int16, ByVal n2 as Int16) As Int16
        Return n1 + n2
    End Function

End Module

Form1.vb 中的用法

由于模块将位于项目中的引用命名空间中,因此您只需直接调用它:

Public Sub DoAdd()
    Dim x as Int16 = MyFunctions.Add(15, 16)  ' This assumes that your MyFunctions
                                              ' module is in an imported namespace
End Sub

【讨论】:

  • vb6 上数百万小时。 vb.net 相当新。什么是“正确”的 vb.net 做这样的事情:我只想制作一个单独的文件,它有 50 个非常通用的函数,我可以快速/轻松地调用我需要的任何地方。我认为“命名空间”和“MyFunc.Add()”方式 WAS 是保持事物井井有条(单独文件)和避免冲突(通过使用 MyFunc.Add)语法的正确方法。没有?
  • 那么如果你想继续 VB6 风格,你可能想坚持使用模块。或者你是从面向对象编程开始的?
  • @Susan:是的,我和很多人一起工作。虽然语法是相同的并且一些范式转移了,但 6 和 .Net(例如命名空间)之间有很多不同之处,很多东西都会让你绊倒。您可能会尝试的一件事(作为练习)是从您的引用中删除 Microsoft.VisualBasic 命名空间。这将破坏其中包含旧版 VB6 语法的任何代码,并强制您使用所有 .Net 结构。一开始会加重,但随着时间的推移会好转。
  • 我试图避免仅仅为了调用简单的通用函数而创建无数“实例”。这真的是“正确”的方式吗?它使我的小程序越来越难编写、测试和调试。我创建 50 个通用函数并记住它们的名称没有任何问题....与我的代码的其他部分发生 0 冲突。这不是第一次“函数”击败“创建单独的类和类的实例”吗?
  • @Susan:对于共享方法,您无需创建实例。我将发布一个编辑作为示例。
【解决方案2】:

您必须先创建一个实例,或者如果您不想使用对象,您可能需要创建一个Module,而不是一个Class

您可能错过了退货,它可能应该是以下内容。

Namespace MyFunc1
    Public Class MyFunc2

        Public Function Add(ByVal n1 As Int16, ByVal n2 As Int16) As Int16
            return n1 + n2
        End Function

    End Class
End Namespace

如果您想使用模块:

Namespace MyFunc1
    Module MyFunc2

        Function Add(ByVal n1 As Int16, ByVal n2 As Int16) As Int16
            return n1 + n2
        End Function

    End Module
End Namespace

如果你想使用一个类:

你必须先创建一个MyFunc2的实例

Dim myFuncObj as MyFunc2 = new MyFunc2

然后在带参数的对象上调用方法:

dim result as Int16 = myFuncObj.Add(15,16)

我猜你的背景是 Visual Basic 6.0。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2017-12-14
    • 1970-01-01
    • 2020-05-02
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多