VB.NET函数宝典手把手教会你

开发 后端
这里介绍VB.NET函数,包括介绍模块化是在程序设计发展到一定程度的时候诞生的程序设计方法和在进行变量声明时,变量声明的位置决定了这个变量的作用范围。

经过长时间学习VB.NET函数,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。

在程序设计过程中,随着代码量的不断增加,会出现很多地方使用同样代码的情况。为了能够减少同样代码的编写,ASP.NET允许使用一些小的程序将重复的代码只写一次,其他需要使用这段代码的地方调用这个小程序就可以了。

在ASP.NET中,实现这种小程序的方式有两种:过程和函数。

模块化的优点

模块化是在程序设计发展到一定程度的时候诞生的程序设计方法。在早期的程序设计过程中,由于机器的硬件配置低,所以程序的运行速度和效率十分重要,因此早期的程序设计人员会大量使用各种技巧保证程序的快速运行,而这些技巧导致的最直接后果就是程序的结构混乱,很难阅读。

随着机器硬件的不断更新,这些编程技巧所提高的程序运行速度已经微不足道,这时提高程序的可读性就变得十分重要,于是就出现了模块化程序设计方法。

模块化程序设计方法的特点是:在编写程序之前,把程序的功能分解成若干个小的任务,并把这些小任务看成是一个一个的模块。当各个模块编写完成之后,就可以把这些模块编译成为一个大型的程序。由于每个模块都有自己独立的功能,所以可以把这些模块分配给很多程序员来完成;而每个模块的功能都是详细定义的,所以可以建立完善的文档,使得程序的可读性大大提高。

VB.NET函数

VB.NET支持子过程和函数,它们都可以根据需要设置参数。它们之间惟一的区别是函数可以有返回值而子过程没有。

子过程的定义方式为:

  1. Sub subname ([argument1[,…, argumentn]])  
  2. [statements]  
  3. End Sub 

对于子过程的调用方式是直接调用过程名subname。如果有参数,就在后面按照次序将参数在括号中写好。用一个子过程显示对一个用户的问候信息:

  1. <script language="vb" runat="server"> 
  2. Sub SayHello(strUserName as String)  
  3. Response.Write ("Hello!" & strUserName & "<br>")  
  4. End Sub  
  5. </script> 
  6. <%  
  7. SayHello("Cindy")  
  8. %> 

在上面的例子中,有下面几点需要说明:
(1) 在第1行~第5行使用<Script>标记加入程序代码。
(2) 在第2行~第4行定义了一个SayHello子过程。这个过程带有一个参数strUserName,并在第3行输出。
(3) 在第7行调用了这个子过程。在调用的时候,传入参数的值是“Cindy”。

VB.NET函数的定义方式为:

  1. Function functionname ([argument1[,…, argumentn]])  
  2. [statements]  
  3. [Return value]  
  4. [statements]  
  5. End Function 

对于函数的调用方式是调用函数名functionname()。如果有参数,就按照次序写在括号中。用一个函数计算两个整数的和。

  1. <script language="vb" runat="server"> 
  2. Function Add(intData1 as Integer,intData2 as Integer) as Integer  
  3. intData1intData1=intData1+intData2  
  4. Return intData1  
  5. End Function  
  6. </script> 
  7. <%  
  8. Dim intTemp1,intTemp2 as Integer  
  9. intTemp1=2 
  10. intTemp2=3 
  11. Response.Write(Add(intTemp1,intTemp2))  
  12. Response.Write("<br>")  
  13. Response.Write(intTemp1)  
  14. %> 

在上面的程序中,有下面几点需要说明:
(1) 在第2行~第5行定义了一个函数Add。这个函数带有两个参数:intData1和intData2,并把一个整数作为返回值。
(2) 在第3行把参数intData1与intData2的和放到intData1中,并在第4行把intData1作为结果返回。
(3) 在第11行调用了这个函数,并把结果显示出来。

在上面的子过程和函数的讲解过程中,可以看出都可以采用带参数的方式来增加子过程和函数的灵活性。需要说明的是,参数的传递有两种方式:通过值传递参数和通过引用传递参数。

在调用子过程和函数的时候,如果没有明确地指出,所有的参数都是通过值进行传递的。所谓通过值进行传递,就是把参数的值复制到参数中。例如例2.12中第11行的Add(intTemp1,intTemp2),就是通过值进行传递的好例子。在真正执行第2行~第5行定义的Add函数时,是把intTemp1的值2复制给了intData1,把intTemp2的值3复制给了intData2。在第3行把intData1和intData2的和赋值给intData1的时候,intData1的值变成了5,但是这个时候,intTemp1的值仍然是2,不是5(通过第13行的执行可以看出来),这就是通过值传递参数。这时,intData1和intTemp1是两个不同的变量,在内存中占用不同的存储空间。

在函数和子过程中,使用关键字ByVal来显式表示通过值传递参数。也就是说,如果要用显式的方式进行定义,第2行的函数定义可以写成:

  1. Function Add(ByVal  intData1 as Integer, ByVal  intData2 as Integer) as Integer 

默认的情况是采用通过值传递参数。那么什么是通过引用传递参数呢?请先看下面的例子。用一个函数计算两个整数的和。

  1. <script language="vb" runat="server"> 
  2. Function Add(ByRef intData1 as Integer,ByRef intData2 as Integer) as Integer  
  3. intData1intData1=intData1+intData2  
  4. Return intData1  
  5. End Function  
  6. </script> 
  7. <%  
  8. Dim intTemp1,intTemp2 as Integer  
  9. intTemp1=2 
  10. intTemp2=3 
  11. Response.Write(Add(intTemp1,intTemp2))  
  12. Response.Write("<br>")  
  13. Response.Write(intTemp1)  
  14. %> 

在这里使用了ByRef关键字表示这时的参数是通过引用进行传递的。执行这个程序就会发现,在程序执行完之后,不但intData1的值变成了5,同时intTemp1的值也变成了5。

通过引用传递参数的方法是把参数的地址传递进去。在第11行进行传递的时候,不是把intTemp1的值复制给intData1,把intTemp2的值复制给intData2,而是把intTemp1的地址给了intData1的地址,把intTemp2的地址给了intData2的地址。在传递成功之后,intData1就是intTemp1,intData2就是intTemp2。所以在第3行intData1的值发生变化时,intTemp1的值也同时发生了变化。

变量的作用域

在进行变量声明时,变量声明的位置决定了这个变量的作用范围。在一个过程或VB.NET函数外声明的变量是全局变量,对本程序内部所有的过程和函数都起作用;而在一个过程或函数内部声明的变量是局部变量,只对本过程或函数起作用。

下面通过一个例子说明全局变量和局部变量的区别。全局变量和局部变量的使用。

  1. <script language="vb" runat="server"> 
  2. Dim strGlobal as String="global" 
  3. Sub SayHello  
  4. Dim strTemp as String="hello!" 
  5. Response.Write (strTemp & "<br>")  
  6. Response.Write (strGlobal & "<br>")  
  7. if strGlobal<>"" then  
  8. Dim strTemp1 as String="hello cindy!" 
  9. Response.Write (strTemp1 & "<br>")  
  10. end if  
  11. 'Response.Write (strTemp1 & "<br>")  
  12. End Sub  
  13. </script> 
  14. <%  
  15. SayHello  
  16. %> 

上面的例子中,有下面几点需要说明:

(1) 第2行声明的变量strGlobal定义在所有的VB.NET函数或者过程之外,所以是一个全局变量。由于在定义这个变量的时候就为这个变量赋值为“global”,所以,在后面的程序中,第一次使用这个变量时这个变量的值就是“global”。

(2) 第3行~第12行定义了一个子过程SayHello。在这个过程中,首先在第4行定义了一个变量strTemp,由于这个变量是定义在子过程中的,所以这个变量是一个局部变量。在第5行显示这个变量的值的时候,会显示一个“hello!”字符串。

(3) 第6行要显示strGlobal的值,由于这是一个全局变量,所以会显示第1行赋值的“global”。

(4) 第7行~第10行定义了一个If/Endif代码块,在这个代码块中,定义了一个块级局部变量strTemp1(第8行)。由于这个变量是定义在代码块中的,所以只在这个代码块中起作用。所以在第9行要显示它的值的时候,会显示“hello cindy!”。而如果取消第11行的注释,系统将会通告strTemp1变量没有定义。

通过上面的例子可以看出,在编写程序的时候,要时刻注意变量的作用域的问题。因为在不同模块中修改全局变量会导致模块之间相互影响,违反了进行模块化程序设计的初衷。所以要设计好的程序,就应该尽量减少全局变量的使用。

【编辑推荐】

  1. VB.NET动态控件数组三部曲
  2. 全方位分析VB.NET编码规范
  3. 剖析VB.NET Process的属性与对象
  4. VB.NET SendKeys方法与键入值
  5. 用实例讲述VB.NET Process类
责任编辑:佚名 来源: Vlan9
相关推荐

2009-11-02 15:33:53

VB.NET Data

2009-10-28 14:25:17

VB.NET Sock

2009-12-11 09:04:10

Windows搭建Li

2009-10-27 16:05:52

VB.NET File

2009-11-02 13:14:18

VB.NET函数

2009-12-21 11:36:24

Linux启动加密

2021-06-16 09:02:43

Pythonjieba分词Python基础

2021-12-09 10:24:47

Javascript 高阶函数前端

2010-07-30 10:41:23

DB2打补丁

2009-11-02 15:08:58

VB.NET Obje

2009-10-27 13:34:32

VB.NET WEB服

2020-12-13 11:38:09

Go语言clac包

2009-11-02 09:43:01

VB.NET构造函数

2009-11-03 09:48:47

VB.NET构造

2010-08-17 14:29:15

2009-10-28 17:08:57

VB.NET数据库开发

2009-10-26 13:36:58

VB.NET Spli

2009-10-15 17:50:48

VB.NET Spli

2009-10-30 09:45:55

VB.NET Web

2009-10-21 10:45:50

VB.NET Quic
点赞
收藏

51CTO技术栈公众号