New的含义和List<T>的数据结构-创新互联

在做项目数据同步开发的时候,我碰到一个很奇怪的显现。我首先从数据库获取数据集DataSet然后用Model把数据封装,然后放到List中,最后我遍历List时发现,它里面只放了最后一条数据封装的model.我把代码贴出来如下:

成都创新互联公司是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信平台小程序开发,10余年建站对成都履带搅拌车等多个行业,拥有多年的网站运维经验。
    /// 
    /// 学生实体类
    /// 
    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);
            }

            IEnumerator IEStu = 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);
            }

            IEnumerator IEStu = 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的真正原理。我本以为只要我把list.add(model)list就会拷贝一份model中的信息,实际上List只是添加了一个指向model的地址指针,所以每次添加都会添加一个指向model的地址指针,但他们都指向了同一个地址。所以无论你中间add了多少,(期间,list的指针都指向model地址)只是取决于最后一条数据。

   如果把Student student=new Student();放在foreach中那么每次都会去给model开辟一片内存空间,而list不在指向同一个地址,所以就不会造成数据被覆盖的假象了。

   总结:

       New 的含义就是开辟一片内存创建实例。

       List 中只是保存了一个指向地址指针。

   最后我想告诉大家,数据结构很重要,有些东西很细微,如果不懂的话就很难找出其中的问题。如果我说的有什么不对的请和我分享你的看法。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享名称:New的含义和List<T>的数据结构-创新互联
网页网址:http://ybzwz.com/article/eipdj.html