创建只包含一个共享成员的一个VB.NET类的更简单的方法就是定义一个Module。Module是规则的、不能创建的类,它的成员是静态的。
类模块与模块的区别:
1.类模块中的数据对创建的每一个新实例都是惟一的,而在标准模块中的数据对应 应用程序或者对标准模块内的方法是全局的.
2.当类实例失效时,类模块中的数据也失效,或者收集到垃圾桶,而标准模块在应用程序的生存期都是活动的,直到应用程序退出.
但还是不太清楚其实用性,想问一下大家,
1、如果我在 模块(Module)里实例化一个类,如:
Module Model
Public mod_DB As New DB
…… ……
是否 模块(Module)会把这个 mod_DB 成员 shared 了,并且每次在其他地方调用mod_DB时,mod_DB是共享的,mod_DB里面的数据(如果有)那就一定要是相同的,不然数据就不能独立而错误了。
还是 模块(Module)在每次被调用时都 new 一次 DB 赋给 mod_DB ,这时 mod_DB里面的数据就可以互相独立而不受干扰了??
最后,问一下 在模块(Module)里实例化一个类 是否有其意义。好不好或能不能这样做?
请大家指教指教,谢谢。
我以前做了一个小东西,使用module,就是因为类定义问题出现了bug.
模块(Module)在每次被调用时都 new 一次 DB 赋给 mod_DB 会出现干扰。
模块(Module)里实例化一个类 有其意义,如果那个类是唯一的不可变的,用在module里面很好。
Module好比静态类,可以直接使用ModuleName.FunctionName()调用其中方法。
跟
Class ClassName
public shared Function fnXXX()
...
End Function
End Class
类似
直接使用ClassName.fnXXX()调用。
Module ModuleName
public Function fnXXX()
End Module
调用:ModuleName.fnXXX()
Module里的成员在第一次使用到它时被自动初始化。
(默认有个不带参数的New方法,你可以自己添加)
模块怎么会被new 很多次呢?
你在模块中建立了一个类的实例,那么就相当于声明了一个shared的变量。也就是说你可以在程序的任何地方直接使用该类的这个实例的属性或者方法,而不用再实例化一个出来。
共享级别的过程或者字段,是说经常被调用的对象。比如说连接数据库的字符串和返回连接的方法和过程。
你可以在模块中实例化一个类,定义若干的方法或过程,然后就要使用application.run()来打开一个主窗口(或登录窗口)
存在这种疑问可以自己测试呀:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows 窗体设计器生成的代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As AppClass
a = New AppClass
a = New AppClass
a = New AppClass
End Sub
End Class
Public Class TestClass
Private i As Integer
Sub New()
i = i + 1
End Sub
Public ReadOnly Property NowI() As Integer
Get
Return i
End Get
End Property
End Class
Public Module TestModule
Public m As New TestClass
End Module
Public Class AppClass
Sub New()
MsgBox(TestModule.m.NowI)
End Sub
End Class
再将Module转换为Class,效果是一样的。
Public Class AppClass
Sub New()
MsgBox(TestModuleClass.m.NowI)
End Sub
End Class
Public NotInheritable Class TestModuleClass
Public Shared m As TestClass
Shared Sub New()
m = New TestClass
End Sub
End Class
谢谢 大家的意见!按此说法应该是共享的,但这样 实例了的类的数据也要是一定相同的,不然就会有数据不正确,这样说
在 Module 直接写 需 shared 的方法和其字段,而不用实例化其他的类,因为实实例化一个对象一般是要独立的,不受影响的,这样和 Module 里的 共享 思想就有冲突了,
大家觉得是否是这样呢??
另,谢谢大家的热心帮助!
我那个Public Class TestClass
有点问题
Private i As Integer
应该是
Private Shared i As Integer
这样才能反映i是否改变了。
当然,改了以后的结果还是一样的,i没变。
Module和静态类思想是一样的。在内存中只被实例化一次。当然不需要你进行实例化。
包括一些静态的数据成员,他们在托管堆中的位置与一般对象的位置是不同的。
以上是我自己的想法 :)
感觉是那种首先运行,首先实例化的东西。提供初始化功能,具体功能和class很像!
类模块与模块的区别:
1.类模块中的数据对创建的每一个新实例都是惟一的,而在标准模块中的数据对应 应用程序或者对标准模块内的方法是全局的.
2.当类实例失效时,类模块中的数据也失效,或者收集到垃圾桶,而标准模块在应用程序的生存期都是活动的,直到应用程序退出.
但还是不太清楚其实用性,想问一下大家,
1、如果我在 模块(Module)里实例化一个类,如:
Module Model
Public mod_DB As New DB
…… ……
是否 模块(Module)会把这个 mod_DB 成员 shared 了,并且每次在其他地方调用mod_DB时,mod_DB是共享的,mod_DB里面的数据(如果有)那就一定要是相同的,不然数据就不能独立而错误了。
还是 模块(Module)在每次被调用时都 new 一次 DB 赋给 mod_DB ,这时 mod_DB里面的数据就可以互相独立而不受干扰了??
最后,问一下 在模块(Module)里实例化一个类 是否有其意义。好不好或能不能这样做?
请大家指教指教,谢谢。
我以前做了一个小东西,使用module,就是因为类定义问题出现了bug.
模块(Module)在每次被调用时都 new 一次 DB 赋给 mod_DB 会出现干扰。
模块(Module)里实例化一个类 有其意义,如果那个类是唯一的不可变的,用在module里面很好。
Module好比静态类,可以直接使用ModuleName.FunctionName()调用其中方法。
跟
Class ClassName
public shared Function fnXXX()
...
End Function
End Class
类似
直接使用ClassName.fnXXX()调用。
Module ModuleName
public Function fnXXX()
End Module
调用:ModuleName.fnXXX()
Module里的成员在第一次使用到它时被自动初始化。
(默认有个不带参数的New方法,你可以自己添加)
模块怎么会被new 很多次呢?
你在模块中建立了一个类的实例,那么就相当于声明了一个shared的变量。也就是说你可以在程序的任何地方直接使用该类的这个实例的属性或者方法,而不用再实例化一个出来。
共享级别的过程或者字段,是说经常被调用的对象。比如说连接数据库的字符串和返回连接的方法和过程。
你可以在模块中实例化一个类,定义若干的方法或过程,然后就要使用application.run()来打开一个主窗口(或登录窗口)
存在这种疑问可以自己测试呀:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows 窗体设计器生成的代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As AppClass
a = New AppClass
a = New AppClass
a = New AppClass
End Sub
End Class
Public Class TestClass
Private i As Integer
Sub New()
i = i + 1
End Sub
Public ReadOnly Property NowI() As Integer
Get
Return i
End Get
End Property
End Class
Public Module TestModule
Public m As New TestClass
End Module
Public Class AppClass
Sub New()
MsgBox(TestModule.m.NowI)
End Sub
End Class
再将Module转换为Class,效果是一样的。
Public Class AppClass
Sub New()
MsgBox(TestModuleClass.m.NowI)
End Sub
End Class
Public NotInheritable Class TestModuleClass
Public Shared m As TestClass
Shared Sub New()
m = New TestClass
End Sub
End Class
谢谢 大家的意见!按此说法应该是共享的,但这样 实例了的类的数据也要是一定相同的,不然就会有数据不正确,这样说
在 Module 直接写 需 shared 的方法和其字段,而不用实例化其他的类,因为实实例化一个对象一般是要独立的,不受影响的,这样和 Module 里的 共享 思想就有冲突了,
大家觉得是否是这样呢??
另,谢谢大家的热心帮助!
我那个Public Class TestClass
有点问题
Private i As Integer
应该是
Private Shared i As Integer
这样才能反映i是否改变了。
当然,改了以后的结果还是一样的,i没变。
Module和静态类思想是一样的。在内存中只被实例化一次。当然不需要你进行实例化。
包括一些静态的数据成员,他们在托管堆中的位置与一般对象的位置是不同的。
以上是我自己的想法 :)
感觉是那种首先运行,首先实例化的东西。提供初始化功能,具体功能和class很像!