若有如下代码:
Dim a As New obj1 'obj1为一个自己写的类
Dim b As New obj1
a.ss = 1 '为类内变量ss赋值
a.cc = 1 '为类内变量cc赋值
b = a
b.ss = 100
b.cc = 666
Debug.Writeline("a.ss = " & a.ss)
Debug.Writeline("a.ss = " & a.cc)
此时输出为:
a.ss = 100
a.cc = 666
发现对b的更改同样作用于a,因为b指向a的内存地址。
如果需要在保持a不变的情况下使用由a赋值的b,需要将a克隆,再将克隆的对象赋值给b。
而克隆的思路是先用BinFormatter的Serialize方法,把对象存储在MemoryStream流中,再用将其Deserialize反序列化,得到流,最后将其转化为原对象的类型。
操作代码如下:
1.为类声明可序列化,添加Clone()函数:
'对obj1的声明前需加上"<Serializable()>",使其可序列化
<Serializable()> Public Class obj1
Public ss As Integer
Public cc As Integer
'为类添加Clone函数
Public Function Clone() As obj1
Dim BFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Dim MStream As New IO.MemoryStream()
BFormatter.Serialize(MStream, Me)
MStream.Position = 0
Return CType(BFormatter.Deserialize(MS), obj1)
End Function
End Class
2.在使用过程中调用Clone()函数。
Dim a As New obj1
a.ss = 1
a.cc = 1
Dim b As New obj1 = aa.Clone()
b.ss = 100
b.cc = 666
现在b不再指向a的内存地址,可以放心地操作对象b了。