当前位置 >> 课程学习 >> 第4章 >> 4.1 基本概念

4.1 基本概念

4.1.4 函数和过程

    1.函数
    VB.NET包含内置的或内部的函数,如MsgBox、CStr等。此外,还可用Function语句编写自己的Function过程。函数过程的语法是:
    {Private|Public|Friend|} Function functionname(argument list)[As data type]
    Statements
    End Function
    与Sub过程一样,Function过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与Sub过程不同的是,Function过程可返回一个值到调用的过程。在Sub过程与Function过程之间有三点区别:
    (1)一般来说,语句或表达式的右边包含函数过程名和参数(returnvalue=function),这就调用了函数。
    (2)与变量完全一样,函数过程有数据类型。这就决定了返回值的类型(如果没有As子句,缺省的数据类型为Object)。
    (3)可以给functionname赋一个值,即为返回的值。
    Function过程返回一个值时,该值可成为表达式的一部分。例如,下面是已知直角三角形直角边的值,计算第三边(斜边)的函数:
    Function Hypotenuse(A as Integer,B As Integer) As String
    Hypotenuse=Math.Sqrt(A^2+B^2)
    End Function
    在Visual Basic中调用Function过程的方法和调用任何内部函数的方法是一样的:
    Label1.Text=CStr(Hypotenuse(CInt(Text1.Text),CInt(Text2.Text)))
    strX=CStr(Hypotenuse(Width,Height))
    2.Sub过程
    Sub过程是在响应事件时执行的代码块。将模块中的代码分成Sub过程后,在应用程序中查找和修改代码变得更容易了。Sub过程的语法是:
    {Private|Public|Friend} Sub subname([arguments list])
    statements
    End Sub
    其中,arguments list是参数列表,可以象声明变量一样声明参数。
    每次调用过程都会执行Sub和End Sub之间的statements。可以将子过程放入标准模块、类模块中。按照缺省的规定,所有模块中的子过程为Public(公用的)这意味着在应用程序中可随处调用它们。在Visual Basic中应区分通用过程和事件过程这两类子过程
    (1)通用过程
    通用过程告诉应用程序如何完成一项指定的任务。一旦确定了通用过程,就必须由专有应用程序来调用。反之,在响应用户引发的事件或系统引发的事件而调用事件过程之前,事件过程通常总是处于空闲状态。建立通用过程就是为了将几个不同的事件过程所要执行的同样语句“提”出来。将公共语句放入一个分离开的过程(通用过程)并由事件来调用它,这样一来就不必重复代码,也容易维护应用程序。面向过程的编程思想就是每个事件对应相应的过程,一般来说,过程的大小应在60至200行代码之间,如果小于这个范围,就要考虑这个过程是否需要单独提出来,如果大于这个范围,就应当考虑是否应将大的过程细化,一个好的程序风格总会看到其层次关系,也就是过程既有它需要调用的子过程,还有调用它的父过程。
    (2)事件过程
    当Visual Basic中的对象对于个事件的发生做出认定时,便自动用相应于事件的名字调用该事件的过程。因为名字在对象和代码之间建立了联系,所以说事件过程是附加在窗体和控件上的。
    ①一个控件的事件过程将控件的实际名字(在Name属性中规定的)、下划线(_)和事件名组合起来。
    例如,如果希望在单击了一个名为btnPlay的命令按钮之后,这个按会调用事件过程,则要使用btnPlay_Click过程。
    ②一个窗体事件过程将窗体的名字空间、下划线和事件名组合起来。如果希望在单击窗体之后,窗体会调用事件过程,则要使用Form_Click过程(和控件一样,窗体也有惟一的名字,但不能在事件过程的名字中使用这些名字。)
    用户虽然可以自己编写事件过程,但使用Visual Basic提供的代码过程会更方便,这个过程自动将正确的过程名包括进来。从“对象框”中选择一个对象,从“过程框”中选择一个过程,就可在“代码编辑器”窗中选择一个模板。在开始为控件编写事件过程之前先设置控件的Name属性,这样可以避免在编译时产生一定的错误隐患。如果对控件附加一个过程之后又更改控件的名字,那么也必须更改过程的名字,以符合控件的新名字。否则,Visual Basic无法使控件和过程相符。过程名与控件名不符时,过程就成为通用过程。
    3.调用
    (1)调用Sub过程
    与Function过程不同,在表达式中,Sub过程不能用其名字调用,调用Sub过程的是一个独立的语句。Sub过程还有一点与函数不同,它不会用名字返回一个值。但是,与Function过程一样,Sub过程也可以修改传递给它们的任何变量的值。调用Sub过程有两种方法:
    Call MyProc(FirstArgument,SecondArgument)
    MyProc(FirstArgument,SecondArgument)
    以上两个语句都调用了名为MyProc的Sub过程。
    (2)调用函数过程
    通常,调用自行编写的函数过程的方法和调用Visual Basic内部函数过程(例如Abs)的方法一样:即在表达式中写上它的名字。
    下面的语句都调用函数MyFunc:
    TextBox1.Text=CStr(10*MyFunc)
    X=MyFunc()
    就象调用Sub过程那样,也能调用函数。下面的语句都调用同一个函数:
    Call Year(Now)
    Year(Now)
    当用这种方法调用函数时,Visual Basic放弃返回值。
    4.调用其他模块中的过程
    在工程中的任何地方都能调用类模块或标准模块中的公用过程。可能需要指定这样的模块,它包含正在调用的过程。调用其他模块中的过程的各种技巧,取决于该过程是在类模块中还是在标准模块中。
    在类模块中调用过程要求调用与过程一致并且指向类实例的变量。例如,DemoClass是类Class1的实例:
    Dim DemoClass As New Class1
    DemoClass.SomeSub在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是DemoClass)并用变量名引用它。
    标准模块中的过程如果过程名是惟一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个惟一过程。如果过程仅出现在一个地方,这个过程就是惟一的。如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一个公共过程就会运行该模块内的过程。例如:对于Module1和Module2中名为CommonName的过程,从Module2中调用CommonName则运行Module2中的CommonName过程,而不是Module1中的CommonName过程。从其他模块调用公共过程名时必须指定那个模块。例如,若在Module1中调用Module2中的CommonName过程,要用下面的语句:
    Module2.CommonName(arguments)
    5.向过程传递参数
    过程中的代码通常需要某些关于程序状态的信息才能完成它的工作。信息包括在调用过程时传递到过程内的变量。当将变量传递到过程时,称变量为参数。
    1.参数的数据类型
    过程的参数被缺省为具有Object数据类型,不过,也可以声明参数为其他数据类型。例如,下面的函数接受一个字符串和一个整数:
    Function WhatsForLunch(WeekDay As String,Hour As Integer) As String
    '根据星期几和时间,返回午餐菜单
    If WeekDay="Friday" Then
    WhatsForLunch="Fish"
    Else
    WhatsForLunch="Chicken"
    End If
    If Hour>4 Then WhatsForLunch="Too Late"
    End Function
    2.按值传递参数
    在VB.NET中缺省的是按值传递参数方式。按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用“ByVal”关键字指出参数是按值来传递的。例如:
    Sub PostAccounts(ByVal intAcctNum As Integer)
    '这里放语句
    End Sub
    注意:ByVal关键字可以省略。
    3.按地址传递参数
    按地址传递参数是过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可改变变量值。按地址传递参数如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。Visual Basic计算表达式,如果可能的话,还会按要求的类型将值传递给参数。把变量转换成表达式的最简单的方法就是把它放在括号内。用“ByRef”关键字指出参数是按地址来传递的,按地址传递的效率比较高,因为,无论变量是什么类型,传进的都只是4个字节。如下例:参数“RunningTotal”是按地址传进来的,因此传进的变量值为参数“AcctNum”的值。
    Sub PostAccount(ByVal AcctNum As Integer,ByRef RunningTotal As Single)
    RunningTotal=AcctNum
    End Sub4.使用可选的参数
    在过程的参数列表中列入“Optional”关键字,就可以指定过程的参数为可选的。指定可选参数,根据以下三条规则:
    (1)每个可选的参数一定要有一个缺省值;
    (2)可选参数的缺省值必须是个常数;
    (3)可选参数的后面的所有参数也需是可选参数
    下面的例子给出了带有可选参数的过程的定义:
    Sub subName(Optional ByVal MyCountry As String="China")
    ....