对象赋值的问题,当执行B=A,然后改变B中的一些内容后,结果A也同时进行了改变 我编写了一个类Px,并定义了两个类对象A、B,把A实例化后,B没有实例化,这时执行B=A,然后改变B中的一些内容后,结果A也同时进行了改变。怎么能操作B时与A脱离关系。如何在类函数中实现B=A这种功能。是否可以采用重载解决。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最简单的,把 Px 从 class 改为 struct = 这个符号不能重载,最好是增加个 复制 的方法,在 B=A 时调用 B=A.Clone() A.后找不到Clone()这个函数啊。我用的是vs2008. 你要自己创建一个 Clone 方法,里面是把 Px 复制一份 深/浅拷贝问题看这个http://www.cnblogs.com/huangchangnan/archive/2008/04/25/1170137.html /// <summary> /// 通过内存序列化的办法克隆一个对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static T MemoryClone<T>(T t) where T : class { System.IO.MemoryStream stream = new System.IO.MemoryStream(); System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); formatter.Serialize(stream, t); stream.Position = 0; return formatter.Deserialize(stream) as T; } 可不可以这样理解?B由于没有被实例化,托管堆没有分配空间,和A指向的同一块内存区域,你操作B也就是操作A 所有引用类型(数组、类)在使用=赋值时都是引用赋值,即B=A表示把B指向A的地址,结果B、A都指向一个地址,当修改了B之后,A自然自动被修改了。一定要先了解值类型和引用类型的区别。 我发问的目的就是如何能摆脱让B不与A指向同一个地址,像C++那样,用简单的方法,不用自己去编写复杂的复制方法就能够实现。 在.Net 3.5以上可以使用JSON进行序列化、反序列化,也可以找一些第三方的序列化/反序列化工具进行,这样就能实现深拷贝了。A->序列化->反序列化->B,这样A和B就是完全独立的两个对象,彼此互不干扰。 自己编写clone很复杂么?一点也不复杂吧class px { public string str = ""; public int a = 0; public px(){} public px Copy() { px P = new px(); P.a = this.a; P.str = this.str; //所有的字段属性赋值 return P; } }A=B.Copy();这样A、B就独立了 C#操作注册表 关于HttpWebResponse返回的一些疑问 调用siinterface.dll 出现一些错误 C#操作数据库(增/删/改)共有几种方法? 请问如何捕获一些未知异常 用户控件的引用问题 一个初学傻瓜的苦恼,帮帮忙! 有没有可以嵌入powerpoint的控件,并且可以捕获翻页动作(100分) WinForm 属性问题 很不清楚啊,大家帮 C#窗体程序连接Access数据库的路径问题 android application
A.后找不到Clone()这个函数啊。我用的是vs2008.
http://www.cnblogs.com/huangchangnan/archive/2008/04/25/1170137.html
/// 通过内存序列化的办法克隆一个对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T MemoryClone<T>(T t) where T : class
{
System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(stream, t);
stream.Position = 0;
return formatter.Deserialize(stream) as T;
}
B=A
表示把B指向A的地址,结果B、A都指向一个地址,当修改了B之后,A自然自动被修改了。一定要先了解值类型和引用类型的区别。
我发问的目的就是如何能摆脱让B不与A指向同一个地址,像C++那样,用简单的方法,不用自己去编写复杂的复制方法就能够实现。
A->序列化->反序列化->B,这样A和B就是完全独立的两个对象,彼此互不干扰。
class px
{
public string str = "";
public int a = 0;
public px(){}
public px Copy()
{
px P = new px();
P.a = this.a;
P.str = this.str;
//所有的字段属性赋值
return P;
}
}A=B.Copy();
这样A、B就独立了