C# 一个类的两个实例 共用变量吗?

时间:2022-01-19 20:12:31
比如:类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


引用 2 楼 caozhy 的回复:
因为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


引用 3 楼 jian8138 的回复:
Quote: 引用 2 楼 caozhy 的回复:

因为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


引用 3 楼 jian8138 的回复:
Quote: 引用 2 楼 caozhy 的回复:

因为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


引用 4 楼 caozhy 的回复:
Quote: 引用 3 楼 jian8138 的回复:

Quote: 引用 2 楼 caozhy 的回复:

因为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


引用 2 楼 caozhy 的回复:
因为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


引用 3 楼 jian8138 的回复:
Quote: 引用 2 楼 caozhy 的回复:

因为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


引用 3 楼 jian8138 的回复:
Quote: 引用 2 楼 caozhy 的回复:

因为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


引用 4 楼 caozhy 的回复:
Quote: 引用 3 楼 jian8138 的回复:

Quote: 引用 2 楼 caozhy 的回复:

因为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)

深拷贝,可以完美的解决您的问题。