在做项目数据同步开发的时候,我碰到一个很奇怪的显现。我首先从数据库获取数据集DataSet然后用Model把数据封装,然后放到List
成都创新互联公司专注于网站建设|成都网站维护公司|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖成都铜雕雕塑等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身策划品质网站。
////// 学生实体类 /// class Student { public string Stuno { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Phone { get; set; } public string Addr { get; set; } public DateTime Register_Time { get; set; } }
Student student = new Student(); foreach (DataRow row in ds.Tables[0].Rows) { student.Stuno = row["Stuno"].ToString(); student.Name = row["Name"].ToString(); student.Sex = row["Sex"].ToString(); student.Age = Convert.ToInt32(row["Age"].ToString()); student.Phone = row["Phone"].ToString(); student.Addr = row["Addr"].ToString(); student.Register_Time = Convert.ToDateTime(row["Register_Time"]); list.Add(student); } IEnumeratorIEStu = list.GetEnumerator(); Student s = new Student(); while(IEStu.MoveNext()) { s=IEStu.Current as Student; Console.WriteLine("[{0}] [{1}] [{2}] [{3}] [{4}] [{5}] [{6}]", s.Stuno, s.Name, s.Sex, s.Age, s.Phone, s.Addr, s.Register_Time); }
尝试着去打断点测试,后来发现是自己的一个想当然给搞砸的。因为只要把Student student=new Student();放在foreach里面就不会有问题了。代码如下:
foreach (DataRow row in ds.Tables[0].Rows) { Student student = new Student();//这语句解决了那个问题。 student.Stuno = row["Stuno"].ToString(); student.Name = row["Name"].ToString(); student.Sex = row["Sex"].ToString(); student.Age = Convert.ToInt32(row["Age"].ToString()); student.Phone = row["Phone"].ToString(); student.Addr = row["Addr"].ToString(); student.Register_Time = Convert.ToDateTime(row["Register_Time"]); list.Add(student); } IEnumeratorIEStu = list.GetEnumerator(); Student s = new Student(); while(IEStu.MoveNext()) { s=IEStu.Current as Student; Console.WriteLine("[{0}] [{1}] [{2}] [{3}] [{4}] [{5}] [{6}]", s.Stuno, s.Name, s.Sex, s.Age, s.Phone, s.Addr, s.Register_Time); }
正所谓知其然,也要知其所以然。现在我来分析下原因:
我的本意呢是想尽量少的分配内存空间去创建实例(优化性能的考虑),所以想通过一个model就作为中转,可是我没有理解对List
如果把Student student=new Student();放在foreach中那么每次都会去给model开辟一片内存空间,而list不在指向同一个地址,所以就不会造成数据被覆盖的假象了。
总结:
New 的含义就是开辟一片内存创建实例。
List
最后我想告诉大家,数据结构很重要,有些东西很细微,如果不懂的话就很难找出其中的问题。如果我说的有什么不对的请和我分享你的看法。
新闻标题:New的含义和List<T>的数据结构
标题来源:http://scgulin.cn/article/iihipo.html