溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

VB.NET對象克隆的主要思想是什么

發(fā)布時(shí)間:2021-10-27 18:03:19 來源:億速云 閱讀:104 作者:柒染 欄目:編程語言

VB.NET對象克隆的主要思想是什么,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

VB.NET編程語言中對對象的操作是比較重要的一個(gè)操作技巧,對于一個(gè)具有面向?qū)ο筇匦缘木幊陶Z言,我們要想徹底掌握這一語言的應(yīng)用,就應(yīng)當(dāng)把這些特性把握好。在這里就先來一起了解一下VB.NET對象克隆的一些基本概念。

在3DMAX里面,做好一個(gè)物體(父物體)以后,可以選擇Edit菜單中的Clone,下面有三中選項(xiàng):Copy(生成一個(gè)同模樣的子物體,兩者的操作互不影響),Instance(父子互動(dòng),父物體的操作同樣影響子物體,子物體也一樣),還有一個(gè)Reference(暫不考慮)。

在VB.NET,同樣會(huì)碰到這樣的問題。創(chuàng)建一個(gè)復(fù)雜對象(可能有很多種不同的數(shù)據(jù)類型)的實(shí)例,進(jìn)行了一系列操作之后,想讓一個(gè)中間變量或幾個(gè)(另外的實(shí)例)保存它的狀態(tài),我們一般采取逐個(gè)變量賦值,有時(shí)候會(huì)寫很長的代碼:)這實(shí)際上就是上述的Copy問題。而對于Instance,很簡單,新建一個(gè)實(shí)例,指向一下就可以了:

Dim objA As New CResume ‘Cresume

是一個(gè)自定義的記錄簡歷信息的類

然后進(jìn)行初始化,比如:

objA.Name=”AAA”  objA.Address=”Shanghai,China”  ……  Dim objB As New CResume ‘新建一個(gè)實(shí)例  objB=objA

這樣的話,objB跟objA有相同狀態(tài),值得注意的是objB改變一個(gè)Name,比如:

objB.Name=”BBB”

而實(shí)際上,objA的Name也變?yōu)椤癇BB”,理由很簡單。它們指向同一塊內(nèi)存空間。

  • VB.NET結(jié)構(gòu)變量的具體操作技巧分享

  • VB.NET創(chuàng)建新變量技巧分享

  • VB.NET固定值變量常用創(chuàng)建方法淺談

  • VB.NET創(chuàng)建數(shù)組正確實(shí)現(xiàn)方法淺談

  • VB.NET初始化數(shù)組變量實(shí)現(xiàn)技巧分享

下面我們重點(diǎn)討論對象的Clone問題,即Copy以后的各個(gè)對象互不影響,關(guān)鍵是如何采用簡單的方法解決我們的問題,MemoryStream和BinFormatter配合一下可以很簡單的實(shí)現(xiàn)VB.NET對象克隆。

MemoryStream,我以前提到過,是支持存儲(chǔ)區(qū)為內(nèi)存的流。

BinFormatter,主要以二進(jìn)制形式序列化和反序列化對象。

主要思路:

先用BinFormatter的Serialize方法,把對象存儲(chǔ)在MemoryStream流中,(操作跟其他Stream一樣),然后Deserialize反序列化,得到一個(gè)流式的數(shù)據(jù),轉(zhuǎn)化為原來對象的類型就可以了。是不是很簡單?呵呵??匆幌麓a再說:

CResume類的代碼:

Imports System.IO  Imports System.Runtime.Serialization.Formatters  < Serializable()> Public Class CResume   &lsquo;注意類前面加上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 = "office:smarttags" />Shanghai,China"  Resume2 = Resume1.Clone()  Resume1.Name = "BBB" Resume1.Address = "Beijing,China" Debug.WriteLine(Resume1.Name) &lsquo;依然是AAA  Debug.WriteLine(Resume1.Address)

總結(jié):主要調(diào)用了VB.NET的流和序列化技術(shù),使得VB.NET對象克隆免去了繁瑣的讀寫操作,也簡化了代碼。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI