2011-04-07 74 views
2

我在下面的代碼中缺少什麼?也許是範圍問題?語法問題?VB.NET命名空間和類語法

我添加了一個新的文件,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 

回到我的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) 
+0

蘇珊你的問題已經有了答案?如果您認爲您最好解決您的問題,那麼您會如此友善以接受答案。 – Chipmunk 2011-04-14 11:07:10

回答

1

你必須首先創建一個實例,或者如果你不想使用對象,您可能需要創建一個模塊,而不是

您可能錯過了一個回報,它應該可能是以下內容。

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的背景的。

1

爲了以您想要的方式進行操作,您需要像@Chipmunk建議的那樣創建類的實例,或者使方法成爲Shared。你也應該擺脫舊的VB6方法。你的方法應該是這樣的:使用

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

Call假定你正在執行一個子,而不是一個功能:

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

編輯:
這將然後使用被調用。函數的目的是返回數據。只要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 
+0

vb6上百萬小時。 vb.net相當新穎。什麼是「正確的」vb.net做這樣的事情:我只想做一個單獨的文件,有50​​個非常通用的函數,我可以快速/輕鬆地調用我需要的任何地方。我認爲「命名空間」和「MyFunc.Add()」方式*是正確的方式來保持組織(獨立文件)並避免衝突(通過使用MyFunc.Add)語法。沒有? – Susan 2011-04-07 14:48:52

+0

然後,如果你想繼續VB6風格,你可能想堅持模塊。還是你開始面向對象編程? – Chipmunk 2011-04-07 14:49:52

+0

@Susan:對,我和很多人一樣工作。雖然語法是相同的,並且一些範例轉移過來,但6和.Net(如名稱空間)之間的差異很大,很多可能會讓你感到興奮。你可能嘗試的一件事(作爲練習)是從你的引用中刪除'Microsoft.VisualBasic'命名空間。這將破壞任何具有傳統VB6語法的代碼,並強制您使用所有.Net結構。它一開始會加重,但隨着時間的推移會變得更好。 – 2011-04-07 14:52:21