static void Main(string[] args)
{
Stack stack = new Stack();
Class1 c=new Class1();
for (int i = 0; i < 10;i++ )
{
c.n = i;
stack.Push(c);
}
for (int i = 0; i < 10; i++)
{
Console.WriteLine(stack.Pop().n);
}
}
上面的代码输出的都是‘9’
static void Main(string[] args)
{
Stack<Class1> stack = new Stack<Class1>();
for (int i = 0; i < 10;i++ )
{
Class1 c = new Class1();
c.n = i;
stack.Push(c);
}
for (int i = 0; i < 10; i++)
{
Console.WriteLine(stack.Pop().n);
}
}
这样把对象new在循环里,输出的就是正确的
(其中Class1这个类里面就一句 public int n;)
我不明白为什么是这样?求解答,谢谢了
第一段代码中,
Class1 c = new Class1(); //只生成一个Class1类的对象 c
for (int i = 0; i < 10; i++) //i 从0循环到9
{
c.n = i; //每次循环,对象c的n值等于i,这样循环结束时,c.n = 9
stack.Push(c); //循环结束时,压了10个Class1类的对象进栈,它们的n值都为9
}
第二段代码中
for (int i = 0; i < 10; i++) //i 从0循环到9
{
Class1 c = new Class1(); //每次循环,生成一个新的Class1类的对象,共生成10个对象实例
c.n = i; //每个对象的n值等于当次循环时的i值
stack.Push(c); //循环结束时,压了10个Class1类的对象进栈,它们的n值各不相同
}
如果对您有帮助,请采纳答案好吗,谢谢!
这个问题的关键是:理解引用类型和值类型的区别。
你第一种写法:Class1是一个类,属于引用类型。每次压栈的都是其实同一个对象(都是Class1的一个实例c)。for循环只是修改了这个c.n的值。for循环结束后相当于你你把c这个对象压栈了10次,每次出栈的都是同一个c。
第二种写法:新建了10个Class1对象,每次压栈的都是一个新的Class1对象,c只是局部变量的名称(出栈过程中无法访问名称c)。自然每次对c的赋值都是对不同的对象。
所以第一种输出都是9,第二种是0-9。