我们常用的变量分为值类型和引用类型,其中引用类型比较特殊,它在使用时是引用其地址,所以在其值发生变化时所有值都会发生变化,常见情况在for循环中例如下面的代码
List<OutData> outData = new List<OutData>();
// 参数清单
List<DeviceParam> ParamList = new List<DeviceParam>();
for (int nPlt = 0; nPlt < tray.Plts.Length; nPlt++)
{
for (int nRow = 0; nRow < nPltRow; nRow++)
{
for (int nCol = 0; nCol < nPltCol; nCol++)
{
if (tray.Plts[nPlt].Bat[nRow, nCol].Type == BatType.OK || !MachineCtrl.GetInstance().updataFakeBindingMES && tray.Plts[nPlt].Bat[nRow, nCol].Type == BatType.Fake)
{
// 值不同时使用
ParamList.First(param => param.Param_Code == (adds.First(p => p.name == "烤箱绑定位置").Item2.Param_Code)).Param_Value = (nPlt + 1) + "-" + (nRow + 1) + "-" + (nCol + 1);
outData.Add(new OutData
{
OUT_LOT_NO = tray.Plts[nPlt].Bat[nRow, nCol].Code,
OUT_TRAY_NO = "",
IN_LOT_NO = new List<string>() { tray.Plts[nPlt].Bat[nRow, nCol].Code },
Is_NG = bWaterRes ? 1 : 0,
NG_Code = new List<string>(),
ParamList = ParamList,
});
}
}
}
if (!machineCtrl.MesResultDataUploadAssembly(this.GetOvenID() + 1, outData, out bool bResult)) return false;
outData.Clear();
}
在上面代码中,outdata.ParamList的值全部都是最后一次循环的值,因为对象也是引用类型,我们使用时只是使用了其地址的引用,如何解决这个问题呢,网上有很多中办发,但是最简单的还是通过序列化然后反序列化得到一个新的对象解决这一问题
更改如下:
for (int nPlt = 0; nPlt < tray.Plts.Length; nPlt++)
{
for (int nRow = 0; nRow < nPltRow; nRow++)
{
for (int nCol = 0; nCol < nPltCol; nCol++)
{
if (tray.Plts[nPlt].Bat[nRow, nCol].Type == BatType.OK || !MachineCtrl.GetInstance().updataFakeBindingMES && tray.Plts[nPlt].Bat[nRow, nCol].Type == BatType.Fake)
{
// 值不同时使用
ParamList.First(param => param.Param_Code == (adds.First(p => p.name == "烤箱绑定位置").Item2.Param_Code)).Param_Value = (nPlt + 1) + "-" + (nRow + 1) + "-" + (nCol + 1);
// 序列化再反序列化得到新对象
var listdata = JsonConvert.SerializeObject(ParamList);
List<DeviceParam> NewParamList = JsonConvert.DeserializeObject<List<DeviceParam>>(listdata);
outData.Add(new OutData
{
OUT_LOT_NO = tray.Plts[nPlt].Bat[nRow, nCol].Code,
OUT_TRAY_NO = "",
IN_LOT_NO = new List<string>() { tray.Plts[nPlt].Bat[nRow, nCol].Code },
Is_NG = bWaterRes ? 1 : 0,
NG_Code = new List<string>(),
ParamList = ParamList,
});
}
}
}
if (!machineCtrl.MesResultDataUploadAssembly(this.GetOvenID() + 1, outData, out bool bResult)) return false;
outData.Clear();
}