C#对象列表 - .Add()引用.Add()按值

时间:2016-12-30 18:24:47

标签: c# list

我有一个查询XML(文件)的应用程序,然后将值存储在列表中。我在不同的文件中以相同的方式定义了2个类:

namespace Cnc11Info
{
    public class AxisInfo
    {
        public char V300_Label { get; set; }
        public double V300_SlowJog { get; set; }
        public double V300_FastJog { get; set; }
    }
}

namespace Cnc11Info
{
    public class DriveInfo
    {
        public static double DriveIndex { get; set; }  
        public static string DriveType { get; set; }
        public static double DriveVersion { get; set; 
    }
}

声明列表相同:

public static List<AxisInfo> axesInfo = new List<AxisInfo>();
public static List<DriveInfo> driveInfo = new List<DriveInfo>();  

.Add()新项目列出相同的内容:

MainWindow.axesInfo.Add(new AxisInfo());
MainWindow.driveInfo.Add(new DriveInfo());   

将数据插入到每个对象的属性中:

MainWindow.axesInfo[index].GetType().GetProperty(propertyName.ToString()).SetValue(MainWindow.axesInfo[index], value);

MainWindow.driveInfo[index].GetType().GetProperty(propertyName.ToString()).SetValue(MainWindow.driveInfo[index], value);

其中index = 0-7。在每次迭代时,为项中的每个属性正确设置值,并且在List的情况下,axisInfo [i]的每个项目都设置正确但对于driveInfo - 每个属性都设置为相同的值,用于所有8个项目列表。我假设简短的回答是driveInfo中的所有对象都是引用,但为什么呢?以及如何解决?

structure of axesInfo

indentical?? structure of driveInfo

1 个答案:

答案 0 :(得分:3)

DriveInfo不是static,但其属性是。{1}}。这与分配单个全局变量是一回事; public static object与您在C#中的Global声明一样接近。

因为属性是静态的,所以DriveInfo的所有实例的属性都具有相同的值。您可以通过添加非static public属性并将其设置为循环变量i作为值来进行测试(因此它会随着计数而增加)。您将看到它随每次迭代而变化,但其他值保持不变。

编辑:总的来说,即使您有20个具有静态属性MyProp的对象,更改MyProp的值也会在对象的每个实例中更改它。