今天一个小练习写了这么几行代码
DataTable dt = SqlHelper.ExecuteDataTable("select * from users");
List<Models.Users> users = new List<Models.Users>();
Users user = new Users();
foreach (DataRow row in dt.Rows)
{
user.Name=row["Name"].ToString();
user.LoginId=row["LoginId"].ToString();
user.Id = Convert.ToInt32(row["Id"]);
user.BirthDate = Convert.ToDateTime(row["BirthDate"]);
users.Add(user);
}
猜猜发生了什么事,
当然users集合里面记录的永远都是同样的数据。
之前却没注意过,去查了下list集合:Add( ) 在List中添加一个对象的公有方法。
突然明白了list集合里面存储的都是一个一个的对象。每个位置都存储了这么一个对象。如果后面对象变化了,里面的东西当然要变化了!
然后我把Users user = new Users(); 放到循环里面,问题来了,在第二次循环还是后,之前的user对象哪里去了呢?(正常即使中间gc了,应该也是没有销毁,因为list中有东西引用着他呢),反正是user这个名字里面的东西都变了,但是集合里面第一个对象还是第一个对象。
为什么呢,
写上面那句话的时候,想起来之前看过的CLR,突然明白了。
第一个对象仍然存在于托管堆上,只是user这个变量不在引用他了而已,引用他的是list对象中的第一个索引。 大概是这样理解吧。