需要帮助解释C#中的ForEach行为



我正在编写一个小工具,从应用程序读取字节文件,更改字节文件中的值并保存新文件。在这个过程中,我在ForEach循环中遇到了一个无法解释的行为。

我有一个array list,它有一个字节文件的自定义对象类型(ExtendedHeader(的核对编号,现在正试图批量编辑每个ExtendedHeaders的一个值,如下所示

foreach (ExtendedHeader extendedHeader in extendedHeaders)
{
ExtendedHeader currentExtendedHeader = extendedHeader;
Console.Write(currentExtendedHeader.Time);
currentExtendedHeader.Time = 1;
currentExtendedHeader = extendedHeader;
Console.Write(currentExtendedHeader.Time);
}

WriteLine的输出是6 1。6很好,因为它是extendedHeader对象中的默认值。然而,我不明白为什么extendedHeader的每个实例都将其新值设置为1,因为按照我的理解,我在循环中创建了每个extendedHeader实例的副本,称为currentExtendedHeader,它在任何时候都不会直接覆盖循环中的extendedHeader实例(如果我是正确的,这甚至不可能直接覆盖(。因此,在我将时间变量设置为1并用循环的extendedHeader重写currentExtendedHeader之后,我将期望6 6的输出。

我的逻辑在哪里?

foreach循环或变量赋值通常不会创建对象的副本。相反,它将引用传递到该变量=>只有一个对象,但有多个指向该对象的指针。变量基本上只是内存中的一个地址,您可以让多个变量指向同一地址,而无需创建对象的副本。

当您设置currentExtenderHeader时,并不是在克隆对象。看见https://learn.microsoft.com/en-us/dotnet/api/system.object.memberwiseclone?view=net-5.0.这是一种可以用来克隆对象的方法,但并不完美。更好的方法是在对象上实现ICloneable接口:https://learn.microsoft.com/en-us/dotnet/api/system.icloneable?view=net-5.0,如果ExtenderHeader是您的对象之一。

最新更新