Пространство имен VB.NET и синтаксис класса - PullRequest
2 голосов
/ 07 апреля 2011

Чего мне не хватает в приведенном ниже коде?Может проблема в сфере?Синтаксическая проблема?

Я добавил новый файл, class1.vb, в свой проект VB.NET, содержащий:

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

.:

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)

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Для того, чтобы сделать это так, как вы хотите, вам нужно либо создать экземпляр классов, как предлагает @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 предполагает, что вы выполняете подпрограмму, а не функцию. Назначение функции - вернуть данные. Просто Call это не приведет к желаемому эффекту.

Редактировать 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
1 голос
/ 07 апреля 2011

Сначала необходимо создать экземпляр или, если вы не хотите использовать объекты, вы можете создать Модуль , а не Класс .

* 1006.* Возможно, вам не хватает возврата, и это, вероятно, должно быть следующим:
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.

...