必威注册电子书籍教程中心网文荟萃客户留言繁體中文
设为首页
加入收藏
联系必威注册
您当前的位置:必威注册 -> 教程中心 -> 编程经验 -> JAVA DotNet -> 教程内容 退出登录 用户管理
栏目导航
· Visual Basic· Delphi
· Visual C++· C++ Builder
· JAVA DotNet· 其他相关
热门教程
· 如何在Visual Basic...
· 使用Visual Basic操...
· 使用VB6.0设计Activ...
· VB动态调用外部函数...
· 建立一个程序员自己...
· 如何编写高质量的VB...
· [图文] 为更新到Visual Bas...
· 再谈在VB中调用VC++...
· 用VB语言编程实现JP...
· 用DTS实现SQL数据库...
相关教程
· VB.Net创建不规则窗...
· 把握VB.NET中的流(S...
· 把握VB.NET中的流(S...
· 把握VB.NET中的流(S...
· [图文] VB.NET访问COM+
· Working with MS Ac...
· VB.net中HOOK的应用...
· VB.net中HOOK的应用...
· Henry手记-VB.net ...
· Henry手记-VB.net ...

VB.NET中对象的克隆
作者:佚名来源:必威注册 发布时间:2005-12-29 18:02:38发布人:admin

减小字体 增大字体


VB.NET中对象的克隆

侯永锋

3DMAX里面,做好一个物体(父物体)以后,可以选择Edit菜单中的Clone,下面有三中选项:Copy(生成一个同模样的子物体,两者的操作互不影响),Instance(父子互动,父物体的操作同样影响子物体,子物体也一样),还有一个Reference(暂不考虑)。

VB.NET,同样会碰到这样的问题。必威注册创建一个复杂对象(可能有很多种不同的数据类型)的实例,进行了一系列操作之后,想让一个中间变量或几个(另外的实例)保存它的状态,我们一般采取逐个变量赋值,有时候会写很长的代码:)这实际上就是上述的Copy问题。而对于Instance,很简单,新建一个实例,指向一下就可以了:

Dim objA As New CResume ‘Cresume是一个自定义的记录简历信息的类

然后进行初始化,比如:

objA.Name=”AAA”

objA.Address=”ShanghaiChina”

……

Dim objB As New CResume 新建一个实例

objBobjA

这样的话,objBobjA有相同状态,值得注意的是objB改变一个Name,比如:

objB.Name=”BBB”

而实际上,objAName也变为“BBB”,理由很简单。它们指向同一块内存空间。

下面我们重点讨论对象的Clone问题,即Copy以后的各个对象互不影响,关键是如何采用简单的方法解决我们的问题,MemoryStreamBinFormatter配合一下可以很简单的把对象克隆。

MemoryStream我以前提到过,是支持存储区为内存的流。

BinFormatter主要以二进制形式序列化和反序列化对象。

主要思路:

先用BinFormatterSerialize方法,把对象存储在MemoryStream流中,(操作跟其他Stream一样),然后Deserialize反序列化,得到一个流式的数据,转化为原来对象的类型就可以了。是不是很简单?呵呵。看一下代码再说:

CResume类的代码:

Imports System.IO

Imports System.Runtime.Serialization.Formatters

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里面可以这样调用

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)

总结:主要调用了VB.NET的流和序列化技术,使得对象的克隆免去了繁琐的读写操作,必威注册也简化了代码。


[] [返回上一页] [打 印] [收 藏]
上一篇教程:VB.NET访问COM+
∷相关教程评论∷    (评论内容只代表网友观点,与必威注册立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图 - 管理登录
Copyright 2019 必威注册. All Rights Reserved .
浙ICP备05047688号