实体类中泛型赋值问题?

tonnycao 2012-03-02 09:08:28
各位:问题如下
定义的实体类Model中包含一个泛型List<P>.外部声明List<P> a = new List<P>().
程序中赋值:(此赋值只一次)
a = Model.List<P>;

程序中会改变Model中各属性值,但同时单独声明的a也跟着改变了,为什么呢,该如何处理,Model.List<p>变化的化不影响a。
...全文
573 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonnycao 2012-03-02
  • 打赏
  • 举报
回复
我现在需要Model.List<p>的一份深拷贝,该如何处理,是将p实现ICloneable?
老毕 2012-03-02
  • 打赏
  • 举报
回复
该如何处理,Model.List<p>变化的化不影响a。

另一方面,对List的ToList()方法,满足这个要求了吗?我想是的。问题的核心,在于对拷贝深度的理解。
老毕 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]
Linq也是浅拷贝,一样会一起改变的,你懂不懂啊。
[/Quote]

哦,对的,忘记这茬了。

Linq的ToList()只是得到一个List<T>的拷贝,这样得到的2个List进行的元素增删操作不会相互影响。但元素本身,仍旧需要深拷贝方法,即你使用的类型P,以保证存在元素的副本,而不仅仅是List的副本。
qldsrx 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abbey 的回复:]
哦,我没细看List<T>的成员方法。我的重点是你需要得到一份拷贝,而不是使用具体的某一个方法,呵呵。

你可以借由Linq实现拷贝:
a = Model.List<P>().ToList();
[/Quote]
Linq也是浅拷贝,一样会一起改变的,你懂不懂啊。
老毕 2012-03-02
  • 打赏
  • 举报
回复
哦,我没细看List<T>的成员方法。我的重点是你需要得到一份拷贝,而不是使用具体的某一个方法,呵呵。

你可以借由Linq实现拷贝:
a = Model.List<P>().ToList();
tonnycao 2012-03-02
  • 打赏
  • 举报
回复
是这样的。clone只是复制结构,copy方法只能copy到数组。?
魏飞翔 2012-03-02
  • 打赏
  • 举报
回复
引用和值类型...
老毕 2012-03-02
  • 打赏
  • 举报
回复
List<T>是引用类型,所以对a的赋值,得到的是对Model.List<P>成员的引用。

要避免Model.List<P>的变化不影响a,应该把Model.List<P>进行Clone或者Copy,使a指向Model.List<P>的一个副本,就象是Snapshot一样。
cdglynn 2012-03-02
  • 打赏
  • 举报
回复
9楼正解
老毕 2012-03-02
  • 打赏
  • 举报
回复
class Model
{
public List<P> ListOfP = new List<P>();
......
}

class P
{
public P Clone()
{
p = new P();
... ...
return p;
}
}

a = model.ListOfP.Select(p=>p.Clone()).ToList();

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧