VB.NET模块的总结(一)

来源:互联网 发布:做淘宝客服手机可以么 编辑:程序博客网 时间:2024/05/16 11:03

 Option Explicit On
'默认就是on,意思是变量必须声明(一般用Dim声明变量),不声明编译就会出错
'
Option Explicit 语句:
'
用于在文件级强制对该文件中的所有变量进行显式声明。

'Option Explicit { On | Off }
'
各部分说明
'
On 
'
可选。启用 Option Explicit 检查。如果在 Option Explicit 语句后没有指定 On 或 Off,则默认为 On。 
'
Off 
'
可选。禁用 Option Explicit 检查。 
'
备注
'
如果使用,则 Option Explicit 语句必须出现在文件中其他所有源语句之前。

'当 Option Explicit 出现在文件中时,必须使用 Dim、Private、Public 或 ReDim 语句显式声明所有变量。试图使用未声明的变量名将发生编译时错误。

'如果没有使用 Option Explicit 语句,则所有未声明的变量都是 Object 类型。

'注意   使用 Option Explicit 可避免拼错现有变量的名称,或避免在变量范围不清楚的代码中产生混淆。如果代码中没有指定 Option Explicit,编译器的默认设置将是 Option Explicit On。 
'
示例
'
本示例使用 Option Explicit 语句强制所有变量的显式声明。试图使用未声明的变量将导致编译时错误。Option Explicit 语句只用在模块级。

'Option Explicit On   ' Force explicit variable declaration.
'
Dim MyVar As Integer   ' Declare variable.
'
MyInt = 10   ' Undeclared variable generates error.
'
MyVar = 10   ' Declared variable does not generate error.
Option Strict Off
'不能窄缩转化数据类型,例如只能从int到long的转换,而不能从long 到int 的转换,默认是Option Strict Off 意思是:允许将任何数据类型隐式转换成其他任何数据类型
'
如果Option Strict On 所有的变量(包裹过程和函数的参数)和成员变量都声明时都要加As,否则编译会错误
'
Option Strict 语句:
'
限制隐式数据类型转换只能是拓宽转换。这显式禁止了任何会发生数据丢失的数据类型转换和数值类型与字符串之间的任何转换。

'Option Strict { On | Off }
'
各部分说明
'
On 
'
可选。启用 Option Strict 检查。如果在 Option Strict 语句后没有指定 On 或 Off,则默认为 On。 
'
Off 
'
可选。禁用 Option Strict 检查。 
'
备注
'
如果使用 Option Strict 语句,则该语句必须出现在任何其他代码之前。

'一般情况下,Visual Basic .NET 允许将任何数据类型隐式转换成其他任何数据类型。在将一种数据类型的值转换为精度更低或容量更小的数据类型的值时,将发生数据丢失。不过,如果在这样的转换中将丢失数据,会出现运行时错误信息。Option Strict 确保发出这类转换的编译时通知,以便可以避免这类转换。

'除了不允许收缩转换之外,Option Strict 还将对晚期绑定生成错误。如果对象被赋给声明为属于 Object 类型的变量,该对象就是晚期绑定的。

'注意   如果代码中没有指定 Option Strict,编译器的默认设置将是 Option Strict Off。
Option Compare Binary
'Option Compare 语句:
'
用于在文件级声明当比较字符串数据时所使用的默认比较方法。

'Option Compare { Binary | Text }
'
各部分说明
'
Binary 
'
可选。导致基于从字符的内部二进制表示形式导出的排序顺序进行字符串比较。 
'
Text 
'
可选。导致基于由系统的区域设置确定的不区分大小写的文本排序顺序进行字符串比较。 
'
备注
'
如果使用,则 Option Compare 语句必须出现在文件中其他任何源语句之前。

'Option Compare 语句为类、模块或结构指定字符串比较方法(Binary 或 Text)。如果未包括 Option Compare 语句,则默认的文本比较方法是 Binary。

Module Module1
    
Public aNew As String  '全局公共成员变量,可以在当前项目的任何类和模块中引用
    'Dim aNew As String  '模块的成员变量(字段)绝对不会出现形如:Public Dim aNew As String 的声明
    Dim c = 5  '在Option Strict Off的前提下,Option Explicit Off或者On 都可以编译可以通过,但不能去掉Dim,去掉 后会产生错误,提示错误为:应为声明
    Sub Main()
        
'b = 10  '在Option Strict Off的前提下,Option Explicit Off 时编译可以通过,而Option Explicit On 时编译产生错误,提示错误为:未声明名称"b"
        Console.WriteLine("hello, word!")
        aMethod()
        Console.WriteLine(addTwoNumber(
19))
        textInputBoxAndMsgBox()
        
'Console.WriteLine(c)   前面的声明c的语句不管改成什么,都打印不出c的值,为什么呢?留个疑问给大家
        Dim TestWu As New SubNew()
        Console.WriteLine(TestWu.testSubNew)
        
Dim TestYou As New SubNew("调用有参数构造器")
        Console.WriteLine(TestYou.testCanShuSubNew)
        Console.ReadKey()

    
End Sub

    'Protected Sub aMethod()  '错误
    'Shared Sub aMethod()     '错误
    Sub aMethod()
        Console.WriteLine(
"aMethod")
    
End Sub

    
Sub New() '构造函数
        aNew = "用构造函数初始化aNew成员变量(字段)"
        Console.WriteLine(aNew)
    
End Sub

    
'Private Function addTwoNumber(ByVal a, ByVal b) As Integer  '如果在模块的开始加上了Option Strict On ,则会产生错误,错误提示为: Option Strict On 要求所有变量声明都有“As”子句,如果在模块的开始加上了Option Strict Off或者什么都不加, 则可以通过。
    Public Function addTwoNumber(ByVal a As IntegerByVal b As IntegerAs Integer  '和过程一样,同样不能用Protected和Private修饰函数
        'Return a + b '与下面等价
        addTwoNumber = a + b '与上面等价,这个是VB6返回值的语法,直接让函数名等于返回值
    End Function

    
Sub textInputBoxAndMsgBox() '测试InputBox和MsgBox函数
        Dim userName As String
        userName 
= InputBox("请输入一个名字:""测试InputBox和MsgBox")
        
MsgBox(userName, , "测试InputBox和MsgBox")
    
End Sub

End Module


Class SubNew
    
Private _testSubNew As String = "调用默认构造函数(即无参数构造函数)" '为配合属性定义的
    Public testCanShuSubNew As String '一个公共字段,可以在该类外面被访问
    Sub New() '无参数构造器

    
End Sub

    
Sub New(ByVal X As String'有参数构造器
        Me.testCanShuSubNew = X
    
End Sub


    
Public Property testSubNew() As String  '定义一个属性
        Get
            
Return _testSubNew
        
End Get
        
Set(ByVal value As String)
            _testSubNew 
= value
        
End Set
    
End Property

End Class

'VB中的过程包裹子过程(Sub)和函数过程(Function),其实完全可以把过程称为方法或者函数

'过程和函数都可以接受参数
'
过程(又称子过程)不能有返回值 
'
函数(又称函数过程)可以有返回值,而且返回值加在函数声明的后面,用As实现

'VB中的类默认提供一个无参数构造器,所以你不必在代码里显示定义一个无参数构造器就可以用无参数构造器实例化该类。但一旦在类中定义了一个有参数构造器,你就必须显示定义一个
'
无参数构造器,才能用无参数构造器实例化该类

'模块不能实例化 模块不可继承 模块被隐式的共享(内部成员都是Shared类型,相当与C#中的static)
'
模块的成员不用提供Module名称就可以被访问。既你可以直接用成员的名字访问该成员
'
模块的成员是全局共享的,你可以在程序的任意位置访问这些成员
'
带有Mani()方法的模块可被编译成EXE文件,而不需要提供任何额外的信息指定应用程序的入口点
'
模块可以有Main()函数也可以没有Main()函数
'
通过模块的全局成员变量,我们可以实现B/S结构里面的Session,来判断用户的登陆状态,这个我已经在一个项目实现

'后记:因为以前有过VB6的开发经验,我觉得VB.NET中的模块是为了最大限度的兼容VB6而保留的,不过就模块式编程来说,我还是比较喜欢,C#中没有模块的实现,而VB.NET满足了的体验