“除了全局变量外,还有什么好办法吗?”我迫不急待地想知道结果。
“可以使用共享成员。”大李依然是那么淡淡然,“VB.NET现在是支持真正的面向对象编程,可以继承、使用多态、共享成员和静态成员。共享成员就是在所有类和所定义派生类的实例之间共享的方法、属性、字段和事件。所有使用类创建的对象都可以访问相同的数据、共享实现过程,并且收到相同的激发事件。”
“这么好呀,那怎么实现呢?”我好象又回到了课堂上,满脑都是无知的符号。
“很简单,在Public或Private成员修饰符后加上Shared关键字即可了。Shared关键字指示一个或多个被声明的编程元素将被共享。共享元素不关联于某类或结构的特定实例。可以通过使用类名或结构名称或者类或结构的特定实例的变量名称限定共享元素来访问它们。你来看这段代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Public
Class
ShareClass
Public
Shared
SharedValue
As
String
Public
Shared
Sub
ShareMethod()
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"
' 重写共享字段的值
End
Sub
|
“有两个要点,一个是共享成员如果是方法或属性,我们不用创建实例就可以直接用‘类名.共享成员’的方法进行调用;第二个要点,共享字段是唯一的,你来说说运行后Shared1.SharesValue的值是多少?”
我头脑里转了两圈,既然说共享字段是唯一的,那么Shared1.SharedValue和Shared2.SharedValue其实对应的是同一个共享字段,所以么,我立刻大声说:“是Share Value 2。因为被Shared2.SharedValue修改了。”
“没错!”大李又一次绽放了会心的微笑,真是对我的最高奖赏。“那你还不动手修改一下你的程序?”
好!说做就做。既然共享属性在其调用的时候是不用实例化的,那么我最好能借助构造一个共享属性来实现。并且要能够判断其实例是否存在或是否被销毁,如果不存在就构造一个新的窗体实例,如果存在就对其进行调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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。调用它是如此的方便:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//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在哪呢?”大李这句话真是惊醒梦中人呀!
我立刻动手:
1
2
3
4
5
6
7
8
9
|
Module
Module1
Sub
Main()
Application.Run(Form1.DefInstance)
End
Sub
End
Module
|
并把Module1设为启动项目。运行运行……哈哈,一切都如意!我开始喜欢上VB.NET了。