list集合想到的

来源:互联网 发布:小米笔记本装linux 编辑:程序博客网 时间:2024/05/29 10:23

今天一个小练习写了这么几行代码

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对象中的第一个索引。 大概是这样理解吧。


0 0