简单技术问题!好久没有来了

brando_beat 2009-08-11 04:22:22
碰到一段程序,如下
public aaa(byval AAA as dataset)
{
......
}

调用的地方:
BBB as new dataset
call aaa(BBB)

问题:
虽然aaa函数的参数是byval的,但是最后改变的是BBB的dataset。
请高手解释一下这个现象,或者给微软的链接。
...全文
231 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzuomin 2009-08-16
  • 打赏
  • 举报
回复
mark
树莓派 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vwxyzh 的回复:]
ByVal和ByRef的区别在于:
'这个方法不会把new出来的dataset返回给调用方
public sub aaa(byval AAA as dataset)
{
AAA=new dataset
}
'这个方法会把new出来的dataset返回给调用方
public sub aaa(byref AAA as dataset)
{
AAA=new dataset
}
[/Quote]
我记得还有一个区别,就是一个无法被销毁,一个可以被销毁。
树莓派 2009-08-14
  • 打赏
  • 举报
回复
月经问题。
不知道为什么,等级是红心的人会问出这样的问题。
yurengang 2009-08-14
  • 打赏
  • 举报
回复
通过在过程定义中为相应的参数指定 ByVal 关键字,
可以通过值传递参数
通过在过程定义中为相应的参数指定 ByRef 关键字,可以通过引用传递参数
ByVal
过程不能更改变量或它的任何成员。
过程不能更改变量,但可以更改它指向的实例的成员。
slund 2009-08-14
  • 打赏
  • 举报
回复
D
bwangel 2009-08-13
  • 打赏
  • 举报
回复
dataset是由datatable组成的. 你的dataset虽然是byval,但是里面的datatable还是引用.
想飞的狼 2009-08-13
  • 打赏
  • 举报
回复
对象
BATTLERxANGE 2009-08-12
  • 打赏
  • 举报
回复
我晕~LZ其实是很明白BYVAL和BYREF的区别的!
VAL是引用
REF是指针
都知道的,但是LZ现在的问题是明明传递的是VAL也就是引用,但是却改变了原来的值。。。
看了N个解释既然都是在解释两者的区别
汗颜。。。
Forrest23 2009-08-12
  • 打赏
  • 举报
回复
帮顶+学习
clever_yang 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 brando_beat 的回复:]
碰到一段程序,如下
public aaa(byval AAA as dataset)
{
......
}

调用的地方:
BBB as new dataset
call aaa(BBB)

问题:
虽然aaa函数的参数是byval的,但是最后改变的是BBB的dataset。
请高手解释一下这个现象,或者给微软的链接。
[/Quote]

我的理解是:在aaa()函数中改变 接收的参数AAA对象以后,这个对象和最开始传过去的对象已经不是同一个对象,但是他们指向同一个地址 。 所以当 改变AAA的值以后,改变了AAA指向地址的值,所以这个时候也会更新到BBB这个对象里面



VALUE类型的保存的是值,而引用类型保存的是地址
古今多少事 2009-08-12
  • 打赏
  • 举报
回复
嗯!应该弄清楚……
lww200888 2009-08-12
  • 打赏
  • 举报
回复
最近弄vb.net 有点头痛
tootto 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gba8jing 的回复:]
应该是

浅拷贝 [ByVal] 为指针 是指针指向内存地址(只能引用,不能改变实际数据)(只读)

深拷贝 [ByRef]为对数据所在的地址的操作 (深拷贝的数据是可操作的)(读写)

dim i as Int32
dim s as Int32

i = 10
s = 10

call ii(i)
call ss(s)

public sub ii(ByVal MyI as Int32)

MyI = 0

end sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
public sub ss(ByRef Mys as Int32)

Mys = 0

end sub


在上述两个过程中 i 变量不会被改变为 0 , 而 s 变量会被改变为 0 ,这就是两者的区别。
[/Quote]


这位说错了。深浅拷贝通常指的都是reference type之间的行为.

如浅拷贝:
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1;
当你改变 myClass2 的成员时,myClass1也会同样改变,因为2是指向1的reference。

当实现深拷贝时,myClass2则是与myClass1完全一样的实例,并不是指向1的reference,2变化并不影响1。

不明白楼主明知参数是reference type,为何要声明byVal. 这样写代码的目的是什么?如果被面试这咱题目就死了。从来没这么用过。微软也不会这么用吧??









reachen 2009-08-12
  • 打赏
  • 举报
回复
学习+mark
zhouyanfss 2009-08-12
  • 打赏
  • 举报
回复
简单说来,函数型参修饰byval byref只对值类型有效(值类型你明白的!)
引用类型,本身传的就是地址,byval byref其实是无意义的
vwxyzh 2009-08-11
  • 打赏
  • 举报
回复
ByVal和ByRef的区别在于:
'这个方法不会把new出来的dataset返回给调用方
public sub aaa(byval AAA as dataset)
{
AAA=new dataset
}
'这个方法会把new出来的dataset返回给调用方
public sub aaa(byref AAA as dataset)
{
AAA=new dataset
}
gba8jing 2009-08-11
  • 打赏
  • 举报
回复
应该是

浅拷贝 [ByVal] 为指针 是指针指向内存地址(只能引用,不能改变实际数据)(只读)

深拷贝 [ByRef]为对数据所在的地址的操作 (深拷贝的数据是可操作的)(读写)

dim i as Int32
dim s as Int32

i = 10
s = 10

call ii(i)
call ss(s)

public sub ii(ByVal MyI as Int32)

MyI = 0

end sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
public sub ss(ByRef Mys as Int32)

Mys = 0

end sub


在上述两个过程中 i 变量不会被改变为 0 , 而 s 变量会被改变为 0 ,这就是两者的区别。
oo渣渣oo 2009-08-11
  • 打赏
  • 举报
回复
以上纯属个人意见,仅供参考……其实我觉得楼主也没必要钻那个牛角尖……呵呵
oo渣渣oo 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 brando_beat 的回复:]
呵呵,我知道是传的对象,但是为什么用byval的参数,还是传过去的是对象,那还不如用byref。
请大家解释。和深拷贝和浅拷贝有关系吗?
如果不是dataset,就不会出现BBB被改变的情况,只有在dataset一些特殊对象才会这样。
[/Quote]

把已经实例化的对象当做参数传递时,ByVal和ByRef的区别意义已经不大了,实际都是一样的。这应该只是VB的语法习惯而已。ByVal和ByRef只对变量有用。
longhair9711 2009-08-11
  • 打赏
  • 举报
回复
UP
加载更多回复(7)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧