List <Rectangle> - 表现得像拳击一样

pko*_*iej 2 c# list value-type

我们都知道泛型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);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 8

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

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

既然你不能使预制的矩形不可变,我恐怕你不得不把它复制出来; 改变它; 并把它放回去.