我開始佩服起大李來了,同時對VB.NET充滿了好奇與了解的渴望。
“除了全局變量外,還有什麼好辦法嗎?”我迫不急待地想知 道結果。
“可以使用共享成員。”大李依然是那麼淡淡然, “VB.NET現在是支持真正的面向對象編程,可以繼承、使用多態、共享成員 和靜態成員。共享成員就是在所有類和所定義派生類的實例之間共享的方法、屬 性、字段和事件。所有使用類創建的對象都可以訪問相同的數據、共享實現過程 ,並且收到相同的激發事件。”
“這麼好呀,那怎麼實現呢? ”我好象又回到了課堂上,滿腦都是無知的符號。
“很簡單, 在Public或Private成員修飾符後加上Shared關鍵字即可了。Shared關鍵字指示一 個或多個被聲明的編程元素將被共享。共享元素不關聯於某類或結構的特定實例 。可以通過使用類名或結構名稱或者類或結構的特定實例的變量名稱限定共享元 素來訪問它們。你來看這段代碼
Public Class ShareClass Public Shared SharedValue As String Public Shared Sub ShareMethod() MsgBox("This is a shared method.") End Sub End ClassSub TestShared() Dim Shared1 As New ShareClass() ' 創建了類的一個實例. Dim Shared2 As New ShareClass() '創建了類的第二個實例. Shared1.SharedValue = "Share Value 1" '給共享字段賦值. Shared2.SharedValue = "Share Value 2" ' 重寫共享字段的值 ShareClass.ShareMethod() '不用創建實例就可以調用類的方法. End Sub
“有兩個要點,一個是共享成員如果是方法或屬性,我 們不用創建實例就可以直接用‘類名.共享成員’的方法進行調用;第 二個要點,共享字段是唯一的,你來說說運行後Shared1.SharesValue的值是多少 ?”
我頭腦裡轉了兩圈,既然說共享字段是唯一的,那麼 Shared1.SharedValue和Shared2.SharedValue其實對應的是同一個共享字段,所 以麼,我立刻大聲說:“是Share Value 2。因為被Shared2.SharedValue修 改了。”
“沒錯!”大李又一次綻放了會心的微笑,真 是對我的最高獎賞。“那你還不動手修改一下你的程序?”
好 !說做就做。既然共享屬性在其調用的時候是不用實例化的,那麼我最好能借助 構造一個共享屬性來實現。並且要能夠判斷其實例是否存在或是否被銷毀,如果 不存在就構造一個新的窗體實例,如果存在就對其進行調用:
Private Shared m_vb6FormDefInstance As Form1 Public Shared Property DefInstance() As Form1 Get If m_vb6FormDefInstance Is Nothing OrElse _ m_vb6FormDefInstance.IsDisposed Then ‘判斷窗體 實例是否存在 m_vb6FormDefInstance = New Form1() End If DefInstance = m_vb6FormDefInstance End Get Set(ByVal Value As Form1) m_vb6FormDefInstance = Value End Set End Property
在Form2中也加入相似的代碼,只不過把Form1改為Form2 。調用它是如此的方便:
//Form1中的代碼 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Hide() Form2.DefInstance.Show() End Sub //Form2中的代碼 Private Sub Button1_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click Me.Hide() Form1.DefInstance.Show() End Sub Private Sub Form2_Closing(ByVal sender As Object,_ ByVal e As System.ComponentModel.CancelEventArgs) _ Handles MyBase.Closing Form1.DefInstance.Show() End Sub
趕緊運行一下,不對呀,第一個窗體裡文本框改為 “Henry的作品”後,再切換仍是不見了?我疑惑地抬頭看了看大李。
“你再好好想想,第一次啟動的是什麼?”大李模糊地說了一 句。
“第一次啟動的是作為主線程的Form1窗體呀!”我嘟啷 著說。
“那麼Form1.DefInstance在哪呢?”大李這句話真是 驚醒夢中人呀!
我立刻動手:
Module Module1 Sub Main() Application.Run(Form1.DefInstance) End Sub End Module
並把Module1設為啟動項目。運行運行……哈 哈,一切都如意!我開始喜歡上VB.NET了。