比如:类A有两个实例 B 和 C, 相继实例化之后,分别向他们传递变量 LIST[ ] B 和 LIST[ ] C ,然后程序运行时,动态不定时取LIST 中的值,最后却发现 LIST[ ] B 和 LIST[ ] C 混淆起来了,成为了一个新的混合 LIST B+C,然后实例B 和C 共用了 LIST B+C。为什么会出现这样的情况呢,C# 一个类的两个实例 共用变量吗?
有什么解决办法?求指点,有详细代码最好。
7 个解决方案
#1
做成static变量,可以共用,否则只属于每个实例自己
#2
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
#3
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
#4
没法改动。除非你List中包含的那个对象定义成值类型(用struct代替class)
#5
可以百度一下值传递,引用传递,你就明白为什么会是这样了
#6
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
a = new A();
a.i=3;
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
这样做可以,既然引用是同一个会影响,那么new一个,就不是同一个引用了。
#7
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
没法改动。除非你List中包含的那个对象定义成值类型(用struct代替class)
深拷贝,可以完美的解决您的问题。
#1
做成static变量,可以共用,否则只属于每个实例自己
#2
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
#3
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
#4
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
没法改动。除非你List中包含的那个对象定义成值类型(用struct代替class)
#5
可以百度一下值传递,引用传递,你就明白为什么会是这样了
#6
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。
那应该如何改动,才可以每个实例拥有自己独立的变量呢?
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
a = new A();
a.i=3;
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
这样做可以,既然引用是同一个会影响,那么new一个,就不是同一个引用了。
#7
因为List中放的是对象的引用,作用于一个,会影响所有的,比如:
class A
{
public int i;
}
A a = new A();
a.i = 3;
List<A> list1 = new List<A>();
list1.Add(a);
List<A> list2 = new List<A>();
list2.Add(a);
list1[0].i = 4;
Console.WriteLine(list2[0].i); // 结果是4,而不是3,也就是说修改list1[0]同样影响到了list2[0],因为它们都是a的引用。