作者aMaa (aMa)
看板Visual_Basic
标题[.NET] 物件类别的ByVal及ByRef问题
时间Wed Dec 30 16:24:25 2009
大家好! 我有个观念上的问题,有关ByVal,ByRef
我的问题以星号标示:
ByVal:呼叫程序的实引数会复制一份给被呼叫的虚引数,因此实引数与虚引数二者
占用不同记忆体位址,当二者其一被修改时并不会互相影响值。
ByRef:实引数与虚引数占用相同记忆体位址,因此虚引数一改变,对应的实引数也改变。
☆1.如上的说法,是不是代表ByVal是复制的功能,将内容复制一份给不同变数?
那如果我自已写一个类别,其中有属性及方法,
当我将类别new出物件後,以ByVal方式传给另一程序的虚引数,是不是代表物件的"复制"?
会这样问,是因为最近我需要将自已写的类别物件"复制"给其他类别变数,
需内容相同,但彼此独立,亦即占用不同记忆体,这意味着是不是可以用ByVal来传?
另外,在书上说:
如果实引数是阵列的话,不管是写ByVal,.net都会当ByRef来传,
因为阵列名称所存的即是此阵列的起始位址,因此使用整个阵列当引数传递即视为参考
呼叫(ByRef)
☆2.那麽类别物件是不是也有这样的限制,不管是写ByVal,如同传递阵列一样,
.NET只能以ByRef来传?
☆3.如果类别物件不能以ByVal来复制,那麽类别物件的复制(深层复制)如何做到?
注:类别物件的复制:类别物件内容相同,但占用不同记忆体,为个别独立物件
☆4.如果类别物件可以用ByVal来复制,那麽ByVal的功能是不是等於clone()
☆5.类别物件的复制还有哪些方式可以做到?
再请大家解惑,谢谢!
※ 编辑: aMaa 来自: 140.96.98.77 (12/30 16:28)
1F:推 fumizuki:物件类别必须自行实作Clone的功能 12/30 20:28
2F:推 fumizuki:假使System.Array没有提供Clone方法,也是必须自行实作 12/30 20:32
3F:推 horngsh:基本上在C#还是VB.NET, CLASS当成参数的传递都是ByRef, 除 12/30 21:22
4F:→ horngsh:非您的类别有实作IClonable介面, 才可以用ByVal 12/30 21:23