Module Module1
Sub Main()
Dim theFirstInstanceOfTestscope As New TestScope
theFirstInstanceOfTestscope.TestScopeSubMethodOne()
'TestScope.TestScopeSubMethodOne()
Dim aStr As String = theFirstInstanceOfTestscope.TestScopeFunctiongMethodOne()
Console.WriteLine(aStr)
Console.ReadLine()
End Sub
Class TestScope
Dim a As String '同Private a As String作用一樣。 類的字段(又稱成員變量)預設是Private和執行個體類型
Private b As String
Public c As String
Private Shared d As String
Sub New() '無參數構造函數
Me.a = "Dim_a"
Me.b = "Private_b"
Me.c = "Public_c"
TestScope.d = "Private Shared_d"
End Sub
'Public Static Sub TestScopeMethodOne() '不能用Static去聲明Sub方法(或者Sub過程),提示錯誤:方法不能聲明為“Static”
Public Sub TestScopeSubMethodOne() '如果改成Private,就不能在類的外部通路
Console.WriteLine(String.Format("TestScopeSubMethodOne():{0} {1} {2}", a, b, c))
Console.WriteLine(TestScope.d) '執行個體方法能通路Shared成員(其實就是靜态成員)
Dim TestScopeFiled As New TestScope
TestScopeSharedSubMethodOne(TestScopeFiled)
'Public Static Function TestScopeFunctiongMethodOne() As String ''不能用Static去聲明Function方法(或者Function函數),提示錯誤:方法不能聲明為“Static”
Public Function TestScopeFunctiongMethodOne() As String '如果改成Private,就不能在類的外部通路
Return String.Format("TestScopeFunctiongMethodOne():{0} {1} {2}", a, b, c)
End Function
Public Shared Sub TestScopeSharedSubMethodOne(ByVal filedOne As TestScope)
'Return String.Format("TestScopeFunctiongMethodOne():{0} {1} {2}", a, b, c) '錯誤: 沒有類的顯式執行個體,就無法從共享方法或共享成員初始值設定項中引用該類的執行個體成員
'這個錯誤和C#其實是一樣的,C#允許執行個體方法可以通路靜态方法和靜态字段,但C#不允許類和結構裡的靜态方法去通路同一個類或結構裡的執行個體方法和執行個體字段,VB.NET也遵從這個規則。
filedOne.a = "用傳參數的形式調用TestScope類的執行個體字段" '但可以用該類的執行個體做為方法的參數來調用執行個體字段和執行個體方法
Dim sharedMethodFiled As String = filedOne.TestScopeFunctiongMethodOne() '但可以用該類的執行個體做為方法的參數來調用執行個體字段和執行個體方法
Console.WriteLine("{0}\{1}", filedOne.a, sharedMethodFiled)
'fileOne.TestScopeSubMethodOne()
Console.WriteLine("TestScopeFunctiongSharedMethodOne")
Dim anotherFiled As New TestScope '還可以通過在靜态方法中執行個體化該類來調用該類的執行個體字段
Console.WriteLine(anotherFiled) '這個方法會用重載的ToString方法來列印該對象
Public Overrides Function ToString() As String
'Return MyBase.ToString()
Return String.Format("{0}::{1}::{2}", a, b, c)
End Class
End Module
''''''列印如下--------------
'TestScopeSubMethodOne():Dim_a Private_b Public_c
'Private Shared_d
'用傳參數的形式調用TestScope類的執行個體字段\TestScopeFunctiongMethodOne():用傳參數的形式調用TestScope類的執行個體字段 Private_b Public_c
'TestScopeFunctiongSharedMethodOne
'Dim_a::Private_b::Public_c
'TestScopeFunctiongMethodOne():Dim_a Private_b Public_c
'''''----------
'一點總結"
'在vb.net中不能用static來聲明方法(Sub和Function),并且不能用來聲明成員變量,隻能用來聲明方法(Sub和Function)中的靜态變量。
'shared既可以用來聲明變量也可以用來聲明方法,還可以用來聲明成員變量,這一點剛好跟static相反。
'vb.ne中的shared更像C#中static的作用。在vb.net中用shared聲明的成員變量(字段)和方法(Sub和Function),隻能用類名來通路,而不能用類的執行個體來通路
'無限循環和無限遞歸會導緻:未處理的“System.StackOverflowException”類型的異常出現在 mscorlib.dll 中
本文轉自terryli51CTO部落格,原文連結: http://blog.51cto.com/terryli/520601,如需轉載請自行聯系原作者