Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;矩形>;-表现得像拳击一样_C#_List_Value Type - Fatal编程技术网

C# 列表<;矩形>;-表现得像拳击一样

C# 列表<;矩形>;-表现得像拳击一样,c#,list,value-type,C#,List,Value Type,我们都知道,泛型列表不包含值类型。为什么在下面的代码段中,rects[1]不受充气方法的影响 如果没有装箱,我想修改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

我们都知道,泛型列表不包含值类型。为什么在下面的代码段中,rects[1]不受充气方法的影响

如果没有装箱,我想修改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);
}
List rects=new List();
对于(int i=0;i<5;i++)
{
Add(新的矩形(1,1,1,1));
}
foreach(矩形中的矩形项)
{
控制台写入线(项目);
}
//矩形r=矩形[1];
//r、 充气(100100);
//rects[1]=r;
直肠[1]。充气(100100);
foreach(矩形中的矩形项)
{
控制台写入线(项目);
}

是,如果执行此操作,
矩形的值将复制到局部变量中


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

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

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

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


既然你不能使预先构建的矩形不可变,恐怕你得把它复制出来;变异它;然后把它放回去。

您能解释一下元素在堆栈和堆中的位置吗?我仍然无法理解它…rects[1]的值被复制到堆栈中。然后在此副本上调用充气,并且列表中的值不受影响。具体何时使用该副本?我的意思是:当我写rect[1]时,使用的是充气副本。那么,为什么当我写rect[1]=new rect(100100)时,新值会替换堆上的值,而不是堆栈上的复制?创建副本的规则是什么?只有在使用字段、局部变量或数组元素时才更新现有结构值。在本例中,您正在调用一个方法(int索引器);这使用堆栈将矩形的新副本返回到本地堆栈(本质上是一个本地…变量)。因此,当您调用rects[1].Inflate(…)时,您正在改变堆栈上的值,然后丢弃它。这是C语言。