问题:
杨老师视频教程中原先Form_Load事件中的代码如下:
using(SqlDataReader dataReader=cmd.ExecuteReader())
{
while (dataReader.Read())
{
PromaryItem item = new PromaryItem();
item.proID = dataReader.GetInt32(dataReader.GetOrdinal("proID"));
item.proName = dataReader.GetString(dataReader.GetOrdinal("proName"));
cb省.Items.Add(item);
}
}
dataReader游标每次移到下一位都要实例化一个new PromaryItem(),我为了节省资源,
就把 PromaryItem item = new PromaryItem()提到while循环外,代码如下:
using(SqlDataReader dataReader=cmd.ExecuteReader())
{
PromaryItem item = new PromaryItem();
while (dataReader.Read())
{
item.proID = dataReader.GetInt32(dataReader.GetOrdinal("proID"));
item.proName = dataReader.GetString(dataReader.GetOrdinal("proName"));
cb省.Items.Add(item);
}
}
结果在cb省_SelectedIndexChanged事件中不管选择什么省,得出的城市都是“香港特别行政区”。
PS:“香港特别行政区”在promary表中为最后一条记录,我就是不明白为什么会这样子?
思路:
new PromaryItem()这个唯一的对象分配在堆上;
用C语言的指针来理解:就是所有省的城市都关联到了new PromaryItem()这个唯一的对象,并且这个对象的城市属性被覆盖为“香港特别行政区”
所以结果就是在cb省_SelectedIndexChanged事件中不管选择什么省,得出的城市都是“香港特别行政区”。
PS:要理解堆和栈才能理解这个问题