正文
vb.netbyval的简单介绍
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
VB.net子程序传参的困惑(ByVal 和Byref 没有区别的时候是为什么??)
这里觉得没有区别,是因为在SubAddRow 里,我们并没有试图改变形参 t 本身,我们所做的改变都是 t.Rows,我们为 t 添加了行。
对于形参和实参而言,在ByVal 模式下 temTable 和 t 指向了同一块内存,但是这两个变量本身并不在同一个地址上。在改变 t.Rows时,由于二者都指向同一块内存,所以更改了t.Rows里的行数据;
在ByRef模式下,temTable 和 t 就是同一块内存,二者在一个地址上,肯定也就指向同一块内存,在改变 t.Rows时,就是对 temTable 的改变。
在此举个例子:假设我们需要将 temTable 清空,那么我们还是以 t 作为形参,我们可以这样写:
' ByVal 方式传参
Private Sub ClearRow(ByVal t As DataTable)
t = Nothing
End Sub
' ByRef 方式传参
Private Sub ClearRow(ByRef t As DataTable)
t = Nothing
End Sub
' 并且这样调用
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
ClearRow(temTable)
DataGridView1.DataSource = temTable
End Sub
这样,就是有区别的了。ByVal方式时,虽然 t 被置为 Nothing ,但是由于 t 和 temTable 并不是一个变量,并不在同一个地址上,所以 temTable 没有变。
而 ByRef 时,t 和 temTable 就是同一个变量,在同一个地址上,t = Nothing的同时,temTable 也就是Nothing了。
如果这个解释还不清楚,可以追问。
vb.net中set(Byval value as integer)有什么用
是一个属性,用于获取值用的
eg:
property text as string
get
return ""'在这里就是获取 text 属性时 返回 ""
end get
set (value as string)
'这里看你让别人给有值放到那里,传进来时 就在 value 这个参数里
textbox1.text=value
end set
end property
当你这样写完时,你写这个属性的对象就会有了 Text 属性 如果 原来有这个属性 会提示你 重载
VB.NET 中,定义sub的时候,byval后面可以定义事件的参数类型么?
括号里只能传参数,不能传过程和函数,形参的参数类型按需要写,不知道该写啥就不写,但是不写容易出错
你想在过程B内部调用A过程,直接call A就行
关于VB里proc调用和ByVal、ByRef的用法。
Proc只是自定义vb.netbyval的过程名,只是一个代号, vb.netbyval你可以随意更改成符合规则vb.netbyval的过程名 比如Sub NewProc或者Sub Proc2 都可以
ByVal,ByRef之间正规的解释为按值传递和按址传递 涉及到指针的内容.因为VB的局限性对指针没有很好的解释.所以如果你不深究的话可以这么理解.
下面是一个举例的代码
dim a as integer,b as integer,c as integer
'定义a b c三个变量 用过调用 Test这个过程 研究 a b c是否变化及其原因
a=10
b=10
c=10
'将a b c都初值化为10
Test a,b,c
'调用过程 来尝试改变 a b c的值 调用时 a 对应过程中的X ,b 对应y,c对应z
debug.print a
debug.print b
debug.print c
'调用过程以后调试输出a b c三者的值 与原来对比
Sub Test(ByVal x integer,ByRef y as integer, z as integer)
x=x+1
y=y+1
z=z+1
End Sub
当参数 以 ByVal的方式调用时 参数在调用时产生vb.netbyval了一个替身.所有对于参数变化的指令都在这个替身上完成.因为都是对替身的操作 所以并不影响原来参数本身的值.
上面的代码上 x 就是以 ByVal方式调用的 所以 在Test的过程中.x产生了一个一样的替身
因为是一样的 所以这个替身的值也是10
然后这句x=x+1 就是这个替身自身的值+1 (注意 这个x是替身) 那么替身的值就变成了11
然后过程调用结束后.替身消失,而原来的值是和替身没有关系的 所以原来的值还是10
而当参数 以 ByRef的方式调用时.参数是不产生这个所谓的替身的.就是说 这个参数是自己本身去参与了过程中对参数的操作的.
上面的代码中 y 是以Byref方式调用的.那么 因为它对应的是b 所以值是10
然后y=y+1 这里是对参数y 本身的操作 而没有替身 所以 y 本身变成了11
而因为y对应的是b 所以 b也就变成了11
而当参数并没有声明以ByVal或者ByRef时调用参数时 其实就是默认省略了以ByRef方式调用(也就是不产生替身的方式,值得注意的是,这个规则是仅适用于VB6以及之前的版本的 在VB.NET中是默认省略了ByVal方式)
了解了这些 你就知道为什么选A了.
题目要求是要返回形参的变化结果,而使用替身操作的ByVal方式并没会影响原来参数的结果,所以不采用这种调用方式,
因为A中没有声明 ByVal或者ByRef时调用参数,就是默认省略了以ByRef方式调用,也就是说 A语句中的代码和下面代码是等价的
Sub Proc(ByRef x as Integervb.netbyval,ByRef y as Integer)
也就是在过程中的改变会影响自身的参数调用方式
关于vb.netbyval和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。