列表<矩形> - 表现得像拳击</rectangle>

时间:2009-03-22 12:07:36

标签: c# list value-type

我们都知道通用List&lt;&gt;没有框值类型。为什么在以下代码片段中,rects [1]不受Inflate方法的影响?

如果没有拳击,我想要改变rect [1]我需要编写三行代码,如图所示 - 评论。有人可以解释一下吗?

List<Rectangle> rects = new List<Rectangle>();

for (int i = 0; i < 5; i++)
{
    rects.Add(new Rectangle(1, 1, 1, 1));
}

foreach (Rectangle item in rects)
{
    Console.WriteLine(item);
}

//Rectangle r = rects[1];
//r.Inflate(100, 100);
//rects[1] = r;

rects[1].Inflate(100, 100);

foreach (Rectangle item in rects)
{
    Console.WriteLine(item);
}

3 个答案:

答案 0 :(得分:8)

这不是装箱 - 只是当你拿出矩形时,你正在操纵矩形的独立副本

这是具有可变值类型(结构)的副作用之一。而且你不应该编写自己的可变结构的原因 - 丢失数据太容易了。

由于你不能使预制的矩形不可变,我担心你不得不把它复制出来;改变它;并把它放回去。

答案 1 :(得分:1)

是的,如果您这样做,Rectangle的值将被复制到您的本地变量。

它不叫拳击。这只是正常的复制,因为Rectangle是一种值类型。

答案 2 :(得分:1)

因为Rectangle是一个值类型,并且调用rects[1]会在索引1处创建Rectangle实例的副本。这就是值类型在.NET中的工作方式。