2

我们都知道泛型 List<> 不会装箱值类型。为什么在下面的代码片段中 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);
}
4

3 回答 3

8

这不是装箱 - 只是当您取出矩形时,您正在操作矩形的独立副本

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

由于您不能使预先构建的矩形不可变,恐怕您将不得不将其复制出来;变异它;并将其放回原处。

于 2009-03-22T12:14:14.877 回答
1

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

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

于 2009-03-22T12:10:41.560 回答
1

因为Rectangle是值类型,调用rects[1]会在索引 1 处复制Rectangle实例。这正是值类型在 .NET 中的工作方式,真的。

于 2009-03-22T12:10:54.430 回答