VB.NET對象克隆的應(yīng)用法則
VB.NET編程語言的應(yīng)用范圍非常廣泛,比如在數(shù)據(jù)庫的連接方面,對于Excle的操作,對于界面的操作等等方面。我們在這里會為大家介紹一下有關(guān)VB.NET對象克隆的實現(xiàn)方法,并對其實現(xiàn)的功能進行一個初步的掌握。
在3DMAX里面,做好一個物體(父物體)以后,可以選擇Edit菜單中的Clone,下面有三中選項:Copy(生成一個同模樣的子物體,兩者的操作互不影響),Instance(父子互動,父物體的操作同樣影響子物體,子物體也一樣),還有一個Reference(暫不考慮)。
在VB.NET,同樣會碰到這樣的問題。創(chuàng)建一個復(fù)雜對象(可能有很多種不同的數(shù)據(jù)類型)的實例,進行了一系列操作之后,想讓一個中間變量或幾個(另外的實例)保存它的狀態(tài),我們一般采取逐個變量賦值,有時候會寫很長的代碼:)這實際上就是上述的Copy問題。而對于Instance,很簡單,新建一個實例,指向一下就可以了:
- Dim objA As New CResume
- ‘Cresume是一個自定義的記錄簡歷信息的類
然后進行初始化,比如:
- objA.Name=”AAA”
- objA.Address=”Shanghai,
China”- ……
- Dim objB As New CResume
‘新建一個實例- objB=objA
這樣的話,objB跟objA有相同狀態(tài),值得注意的是objB改變一個Name,比如:
- objB.Name=”BBB”
而實際上,objA的Name也變?yōu)?ldquo;BBB”,理由很簡單。它們指向同一塊內(nèi)存空間。#t#
下面我們重點討論對象的Clone問題,即Copy以后的各個對象互不影響,關(guān)鍵是如何采用簡單的方法解決我們的問題,MemoryStream和BinFormatter配合一下可以很簡單的把VB.NET對象克隆。
MemoryStream,我以前提到過,是支持存儲區(qū)為內(nèi)存的流。
BinFormatter,主要以二進制形式序列化和反序列化對象。
主要思路:
先用BinFormatter的Serialize方法,把對象存儲在MemoryStream流中,(操作跟其他Stream一樣),然后Deserialize反序列化,得到一個流式的數(shù)據(jù),轉(zhuǎn)化為原來對象的類型就可以了。是不是很簡單?呵呵。看一下代碼再說:
CResume類的代碼:
- Imports System.IO
- Imports System.Runtime.
Serialization.Formatters- < Serializable()> Public
Class CResume- ‘注意類前面加上Serializable()
屬性,否則不可以序列化- Dim m_Name As String '姓名
- Dim m_Address As String '地址
- Public Property Address() As String
- Get
- Return m_Address
- End Get
- Set(ByVal NewAddress As String)
- m_Address = NewAddress
- End Set
- End Property
- Public Property Name() As String
- Get
- Return m_Name
- End Get
- Set(ByVal NewName As String)
- m_Name = NewName
- End Set
- End Property
- Public Function Clone() As CResume
- Dim BF As New Binary.BinaryFormatter()
- Dim MS As New MemoryStream()
- BF.Serialize(MS, Me)
- MS.Position = 0
- Return (CType(BF.Deserialize
(MS), CResume))- End Function
- End Class
在Form里面可以這樣調(diào)用
- Dim Resume1 As New CResume()
- Dim Resume2 As New CResume()
- Resume1.Name = "AAA"
- Resume1.Address = "Shanghai,China"
- Resume2 = Resume1.Clone()
- Resume1.Name = "BBB"
- Resume1.Address = "Beijing,China"
- Debug.WriteLine(Resume1.Name)
‘依然是AAA- Debug.WriteLine(Resume1.Address)
總結(jié):主要調(diào)用了VB.NET的流和序列化技術(shù),使得VB.NET對象克隆免去了繁瑣的讀寫操作,也簡化了代碼。