两个List<>让一个等于另一个,然后改变其一,另一个也会跟着变,怎么回事?
publicclassa{staticvoidMain(string[]args){List<double>x=newList<double>{};List<double...
public class a
{
static void Main(string[] args)
{List<double> x = new List<double> { };List<double> y = new List<double> { };
x.Add(1);
y=x;x[0]=2;
Console.WriteLine(x[0] + " " + y[0]);
Thread.Sleep(999999);
}
}
x[0] 和y[0] 都是2 展开
{
static void Main(string[] args)
{List<double> x = new List<double> { };List<double> y = new List<double> { };
x.Add(1);
y=x;x[0]=2;
Console.WriteLine(x[0] + " " + y[0]);
Thread.Sleep(999999);
}
}
x[0] 和y[0] 都是2 展开
展开全部
代码中,x,y一开始都是新建了一个对象,所以分配了不同的空间,而当你使用 y=x时,这就让y指向了x的空间,所以当x的值发生改变时,y也发生改变
更多追问追答
追问
如果不是list 就不会出现这个问题
double x,y ;
x = 1;
y = x;
x = 2;
Console.WriteLine(x + " " + y);
结果是 x=2 y=1 所以和命名空间没什么关系 我认为这是bug
追答
你这个不是对象,你说的是基本类型,基本类型之间的 = 号,是指赋值而已。
展开全部
把y=x换成y.Add(x[0]),其他不变,结果就成了x[0]=2,y[0]=1。
这两个的区别:
y=x,把x的引用给了y,那么x变了,y也就变了;
y.Add(x[0]),把x[0]的值的引用给了y当前下标,但是x[0]是double 型的,也就是内存中是在常量池内,即y[0]存的是常量池中1的引用。x[0]=2,这里改变了x[0]的引用,注意,不可能把常量池中的1变为2,所以是在常量池中找到2将其引用给x[0],这里跟y[0]无关,所以其存的依然是1的引用。
如果list中存的是一个对象Cat,
x[0].Add(new Cat("白"));
y=x; //对x改变,y也随着改变;
y.Add(x[0]); //对x改变,y也随着改变。因为这里y[0]和x[0]存的同一个对象的引用。
Cat cat = (Cat) x[0]; //并没有生成新对象,cat和y[0],x[0]一样指向同一对象
cat.setColor("黑"); //仍然指向同一对象,并且这个对象已经被改了
这两个的区别:
y=x,把x的引用给了y,那么x变了,y也就变了;
y.Add(x[0]),把x[0]的值的引用给了y当前下标,但是x[0]是double 型的,也就是内存中是在常量池内,即y[0]存的是常量池中1的引用。x[0]=2,这里改变了x[0]的引用,注意,不可能把常量池中的1变为2,所以是在常量池中找到2将其引用给x[0],这里跟y[0]无关,所以其存的依然是1的引用。
如果list中存的是一个对象Cat,
x[0].Add(new Cat("白"));
y=x; //对x改变,y也随着改变;
y.Add(x[0]); //对x改变,y也随着改变。因为这里y[0]和x[0]存的同一个对象的引用。
Cat cat = (Cat) x[0]; //并没有生成新对象,cat和y[0],x[0]一样指向同一对象
cat.setColor("黑"); //仍然指向同一对象,并且这个对象已经被改了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询