当前位置: 代码迷 >> C# >> c# list 引用有关问题
  详细解决方案

c# list 引用有关问题

热度:413   发布时间:2016-04-28 08:40:36.0
c# list 引用问题
假设有一个 class A 
那么 list<A> b 
给b初始添加一些类型A的值
现在设变量 A a = new A();
a = b[0];
我想对a进行一些修改然后在和b[0] 比较 不同则添加进b
但是 修改a后b[0]也会相应修改

我该怎么办 新人比较渣 求助 希望方法简单一点
------解决思路----------------------
对于变量来说分为:值类型, 引用类型。
值类型,比如 a=1;  如果b=a,那么b也=1,这时再修改a或者b,对于另外一个变量来说都没有影响。
引用类型,a=ClassA, b=a, 不管a,还是b获取到的是都是ClassA的存储的地址。所以修改a,或则b,实际修改的是
那个地址的东西。所以大家都变了。
只有几个简单的是属于值类型,比如int ,string ,bool 等,其他的比较复杂的都是属于引用类型。

------解决思路----------------------
你这种情况浅复制就行,稍作修改就行。

A a = new A();
//下面这样修改一下
a = (A)b[0].Clone();

class A:ICloneable//加上ICloneable接口
{
//你原来的类里面加上Clone()方法的实现就行
    public object Clone()
{
return this.MemberwiseClone();
}
}

------解决思路----------------------
C#里,类是引用类型,还有值类型。引用类型的对象存储着地址,值类型存储的是值,举例:声明一个值类型变量,相当于建了个房子,并放进一袋大米,访问这个变量,相当于打开房子取出大米;new一个引用类型的对象,也是建了一个房子,只是房子里放的不是大米,是一张纸条,上书大米存放在XXX大厦A座40层8405房间,根据这个地址就能找到大米。a和b[0]相当于2个房子,a=b[0];相当于2房子中放的纸条上写着一个地址,指向一个放大米的房间。
不要写a=b[0],让改变后的a和list里的每个元素比较不就行了
更多类型问题,去MSDN上去学习吧
------解决思路----------------------
引用:
查下引用类型问题,如果你要两者不一致,那么就要深copy,或者你可以用AutoMapper之类的

如果A类型没有引用引用类型,如:class、interface、delegate、index等,让两个对象不一致,shallow copy 也是可以的。
如果引用了引用类型,要让里面的内容也不一致,就deep copy
  相关解决方案