引用类型的赋值问题--.net 中的Deep Clone
2017-04-15 23:13
274 查看
为了在程序中批量传参数,我将参数封装到一个类中,在程序中有如下代码:
var myPanel = new PanelClass() { dictPanel = panelB.dictPanel, dictFilePanel = panelB.dictFilePanel };
panelB.Clear();
当执panelB执行了Clear之后,发现myPanel的相关属性也被Clear了。
后来查阅资料,问题是引用类型同时指向同一个实体,要想属性不被 Clear掉,
要进行Deep Clone。
public PanelClass Clone()
{
if(!typeof(PanelClass).IsSerializable)
{
throw new ArgumentException("The type must be serializable.","PanelClass");
}
if(Object.ReferenceEquals(this,null))
{
return default(PanelClass);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using(stream)
{
formatter.Serialize(stream, this);
stream.Seek(0, SeekOrigin.Begin);
return (PanelClass)formatter.Deserialize(stream);
}
}
其中相关类头上要增加可序列化标志[Serializable],这样问题可正常解决。
var myPanel = new PanelClass() { dictPanel = panelB.dictPanel, dictFilePanel = panelB.dictFilePanel };
panelB.Clear();
当执panelB执行了Clear之后,发现myPanel的相关属性也被Clear了。
后来查阅资料,问题是引用类型同时指向同一个实体,要想属性不被 Clear掉,
要进行Deep Clone。
public PanelClass Clone()
{
if(!typeof(PanelClass).IsSerializable)
{
throw new ArgumentException("The type must be serializable.","PanelClass");
}
if(Object.ReferenceEquals(this,null))
{
return default(PanelClass);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using(stream)
{
formatter.Serialize(stream, this);
stream.Seek(0, SeekOrigin.Begin);
return (PanelClass)formatter.Deserialize(stream);
}
}
其中相关类头上要增加可序列化标志[Serializable],这样问题可正常解决。
相关文章推荐
- 一起谈.NET技术,引用类型赋值为null与加速垃圾回收
- .Net中引用类型按值参数引用的问题
- (集合和引用类型、基本数据类型赋值不一样)一个简单的java问题 先后的赋值问题
- 引用“.NET研究”类型赋值为null与加速垃圾回收
- JavaScript中的基本类型和引用类型的赋值问题和传参问题
- 问题(怎样在dephi中引用.net中定义的类.方法参数,参数类型为XMLdocument?我要调用此方法并把实例花的xmldocument类型的变量作为参数给它。)
- JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
- (12)数组定义以及引用类型堆内存分配、数组名赋值问题
- 关于.NET中的值类型和引用类型
- double类型赋值问题
- 十二章 类————初始化const或引用类型要用初始化列表,隐式转换问题等,友元
- .NET的值类型和引用类型等
- [导入][你必须知道的.NET]第九回:品味类型---值类型与引用类型(中)-规则无边
- .NET 2.0 中TextBox只读时在客户端赋值后的取值问题
- .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
- .net 中引用js文件出错的问题
- C#中string类型赋值问题
- .Net中的数字类型四则运算的有趣问题
- 在学习.net中的小问题,关于oledb 的日期数据类型
- 终于解决.net 连接oracle数据库时提示的未将对象引用设置到对象的实例的问题