我们都知道通用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);
}
答案 0 :(得分:8)
这不是装箱 - 只是当你拿出矩形时,你正在操纵矩形的独立副本。
这是具有可变值类型(结构)的副作用之一。而且你不应该编写自己的可变结构的原因 - 丢失数据太容易了。
由于你不能使预制的矩形不可变,我担心你不得不把它复制出来;改变它;并把它放回去。
答案 1 :(得分:1)
是的,如果您这样做,Rectangle
的值将被复制到您的本地变量。
它不叫拳击。这只是正常的复制,因为Rectangle
是一种值类型。
答案 2 :(得分:1)
因为Rectangle
是一个值类型,并且调用rects[1]
会在索引1处创建Rectangle
实例的副本。这就是值类型在.NET中的工作方式。