好久没来和讯了,最近喜欢上腾讯微博。想到前几天在写SeleniumRC脚本时,出了一个小白错误,觉得有必要记录一下:
public static List<Campaign> CampaignMapping(string function) {
DataTable dt = parm.getParameter(function);
List<Campaign> camplist = new List<Campaign>();
Campaign camp = new Campaign();
foreach (DataRow data in dt.Rows) {
camp.Name = data[0].ToString();
camp.Type = data[1].ToString();
if (function != "AddCampaign")
{
camp.Store = data[8].ToString();
camp.Feedback_type = data[9].ToString();
}
camplist.Add(camp);
}
return camplist;
}
发现问题了吗?
照上面的写法,camplist中每个Campaign对象的内容都是一模一样的――是最后一个Campaign对象的内容。
正确的写法是:在foreach中创建Campaign Campaign camp = new Campaign();
原因很简单,因为Campaign对象是引用类型,传的是内存地址;而List返回引用类型的副本,所以对于同一个Campaign对象,它改变后,List中的值也改变了。如果在foreach中创建Campaign对象,那么每次都会指向新的Campaign对象,之后再对Campaign对象进行修改,就不会影响之前添加到List中的元素了。
希望这样小白的错误,以后越少出现越好