ByVal和ByRef(编写ASP子程序所用到命令)

ByVal 传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。

ByRef 传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。

ByVal是传递值 源数据不会被修改

你可以把这个值当作自己的局部变量来使用

ByRef是传递地址 , 源数据可能被修改

你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉

实例:

复制代码 代码如下:

sub Add1(ByVal no as int32)

    no=no+100

end sub

sub Add2(ByRef no as int32)

    no=no+100

end sub

private sub button1_click(sender as object,e as eventargs)handles button1.click

    dim a as int32

    a=100

    Add1(a)

    msgbox ("a的值为:" & a)     '显示:a的值为100

    Add2(a)

    msgbox ("a的值为:" & a)     '显示:a的值为200,因为Add2中的参数no为ByRef,即

                                 '按地址传递,因此在Add2中对no进行修改后,将会导致

                                 '源参数a的值也被修改。

End Sub

——————————————————————————————————————

3、ByVal和ByRef

    ByVal传递的参数值,而ByRef传递的参数的地址。在这里,我们不用去区别传指针/传地址/传引用的不同,在VB里,它们根本就是一个东西的三种不同说法,即使VB的文档里也有地方在混用这些术语(但在C++里的确要区分指针和引用)

    初次接触上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory调用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)

    准确的理解传值和传地址(指针)的区别,是在VB里正确使用指针的基础。

    现在一个最简单的实验来看这个问题,如下面的程序三:

【程序三】:体会ByVal和ByRef 

复制代码 代码如下:

Sub TestCopyMemory()

Dim k As Long

k = 5

Note: CopyMemory ByVal VarPtr(k), 40000, 4

Debug.Print k

End Sub

上面标号Note处的语句的目的,是将k赋值为40000,等同于语句k=40000,你可以在"立即"窗口试验一下,会发现k的值的确成了40000。

    实际上上面这个语句,翻译成白话:

 -----------------------------------------------------------------

 就是从保存常数40000的临时变量处拷贝4个字节到变量k所在的内存中。

 -----------------------------------------------------------------

    现在我们来改变一个Note处的语句,若改成下面的语句:

Note2:   CopyMemory ByVal VarPtr(k), ByVal 40000, 4

    这句话的意思就成了,从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存我们无权访问,操作系统会给我们一个Access Violation内存越权访问错误,告诉我们"试图读取位置0x00009c40处内存时出错,该内存不能为'Read'"。

    我们再改成如下的语句看看。

Note3:   CopyMemory VarPtr(k), 40000, 4

    这句话的意思就成了,从保存常数40000的临时变量处拷贝4个字节到到保存变量k所在内存地址值的临时变量处。这不会出出内存越权访问错误,但k的值并没有变。

    我们可以把程序改改以更清楚的休现这种区别,如下面的程序四:

【程序四】:'看看我们的东西被拷贝到哪儿去了 

复制代码 代码如下:

Sub TestCopyMemory()

Dim i As Long, k As Long

k = 5

i = VarPtr(k)

NOTE4: CopyMemory i, 40000, 4

Debug.Print k

Debug.Print i

i = VarPtr(k)

NOTE5: CopyMemory ByVal i, 40000, 4

Debug.Print k

End Sub

程序输出:

5

40000

40000

    由于NOTE4处使用缺省的ByRef,传递的是i的地址(也就是指向i的指针),所以常量40000拷贝到了变量i里,因此i的值成了40000,而k的值却没有变化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做为一个指针来使用。这时,我们必须如NOTE5那样用ByVal来传递指针i,由于i是指向变量k的指针,所以最后常量40000被

时间: 2024-10-02 04:02:40

ByVal和ByRef(编写ASP子程序所用到命令)的相关文章

ByVal和ByRef(编写ASP子程序所用到命令)_应用技巧

ByVal 传送参数内存的一个拷贝给被调用者.也就是说,栈中压入的直接就是所传的值. ByRef 传送参数内存的实际地址给被调用者.也就是说,栈中压入的是实际内容的地址.被调用者可以直接更改该地址中的内容. ByVal是传递值 源数据不会被修改 你可以把这个值当作自己的局部变量来使用 ByRef是传递地址 , 源数据可能被修改 你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉 实例: 复制代码 代码如下: sub Add1(ByVal no as int32)     no=no+

编写asp代码截取字符串

  编写asp代码截取字符串: '函数名:SubstZFC '作 用:截字符串,汉字一个算两个字符,英文算一个字符 '参 数:str ----原字符串 ' strlen ----截取长度 '返回值:截取后的字符串 '适用:标题截取指定字符,如果用LEFT截取,当有英文时就会出现取出来的标题明显太短. '************************************************** Public Function SubstZFC(ByVal str, ByVal strle

在Visual J++中编写ASP COM组件

visual Java是一种以网络为中心的编程语言,许多只使用ASP脚本难以完成的任务可以用Java轻松地实现.同时,扩展ASP应用最好的方法莫过于加入COM组件.那么,可以利用Java为ASP开发组件吗?本文通过实例,说明了在Visual J++环境下开发COM组件的具体过程. 一.概述 自Java问世以来,各种开发工具.开发环境不断出现.这些环境和工具面向不同层次的用户,具有各自的优点.那么,使用Visual J++作为Java开发平台又有哪些优点呢?粗略地讲,这些优点包括: 熟悉的开发环境

用Java编写ASP组件

用Java编写ASP组件    来源 : http://www.edulife.com.cn/Infos/189912/30189912006858.html          ASP通过ActiveX Server Components(ActiveX 服务器元件 ) 使其具有无限可扩充性.在ASP开发当中,免不了使用组件,网上的确有很多的免费,试用的组件,但这是人家的东西,用起来总不免有些担心,自己写的组件用起来才踏实.ActiveX Server Component 可以使用 Visual

在windows 2003 server中编写asp代码需要注意的地方

server|window 在windows 2003 server中编写asp代码,你可能会碰到下面的错误提示"不允许的父路径",涉及到的代码有: Server.MapPath(../)<!--#include file="../"--> 等.可能是出于安全考虑吧,微软屏蔽了脚本中对父路径的访问,但这可能会给我们的编程带来麻烦,尤其是原有asp的代码升级的时候.幸好,这个设置是可以关闭的,具体在下面这个地方IIS管理器中,在你的虚拟路径上点右键,属性,

PerlScript编写ASP

现在我们建立第一个ASP页 <%@Language=PerlScript%> <HTML> <TITLE> PerlScript Test </TITLE> <% for($i=0; $i<=10; $i+=2) { $Response->Write(""); $Response->Write("Hello World! "); } %> </HTML> 在这里大家一定要注意

VB.Net的ByVal和ByRef --ByVal时的浅拷贝和深拷贝

初学VB.Net ,总结一下ByVal和ByRef 1 通过ByVal传递的变量,VB.Net会复制与源值相等的一个新的变量.而ByRef则相当于引用.例如我们学习C的时候得Swap()函数 Imports System'Test that Can't Swap A and BClass MyApp Public Shared Sub Main() Dim A As Integer = 0 Dim B As Integer = 1 Console.writeline("Source: A&quo

VB中Byval和byref的区别

在VB中Byval 和byref怎么区别?简单来说Byval是传值,byref是传地址,ByVal :表示该参数是按值方式传递的.ByRef :表示该参数按引用方式传递.下面绿茶小编为大家详细介绍Byval 和byref的区别. 1.引用参数(ref)在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值,而输出参数(out)在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值,在该函数成员正常返回前都必须已明确赋值. 2.在函数内部,引用参数(ref)被视为初始已赋值,输出参数(ou

vb net-寻找一位会用VB.NET编写ASP.NET的师兄,有些问题请教!!

问题描述 寻找一位会用VB.NET编写ASP.NET的师兄,有些问题请教!! 寻找一位会用VB.NET编写ASP.NET的师兄,有些问题请教!!谢谢!!!! 解决方案 我没学过VB.NET,但我正在学ASP.NET,不知道能否帮助到你的问题 解决方案二: 谢谢,我的程序功能是想实现自动关闭当前页面.