New 的含义和List<T>的数据结构

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

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

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

总结:

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

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

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

时间: 2024-07-31 11:45:54

New 的含义和List<T>的数据结构的相关文章

数据结构习题之绪论

第一章 概 论 一.  基本要求重点.难点 对本章的学习,主要是要熟悉各名词和术语的含义:掌握各种基本概念,特别是数据结构的逻辑结构.存储结构.数据运算3方面的内容及这3方面的相互关系:熟悉C语言的书写规范,理解算法的5个要素的确切含义,即有穷性.确定性.可行性及有输入.有输出,从而掌握计算语句频度和估计算法时间复杂度的方法等,为学习数据结构打下基础. 二.  考核目标和考核要求 要求达到识记层次的有:数据.数据元素.数据项.数据结构等的基本概念:数据结构的逻辑结构.存储结构及数据运算的含义及其

Android学习之访问者模式详解

本文和大家分享的主要是android设计模式中的访问者模式相关内容,一起来看看吧,希望对大家学习android有所帮助. 访问者模式 访问者模式属于行为模式. 访问者模式中属于相对比较复杂的一类,它会在A中让B访问,而实际在B中实际调用的是A的方法. class A { public void method1(){ System.out.println("AAAAAA"); } public void method2(B b){ b.showA(this); } } class B {

SQL笔记 --- 数据库设计步骤(转)

目录 总体设计过程需求分析概念结构设计逻辑结构设计数据库物理设计数据库实施数据库运行和维护 总体设计过程 数据库设计步骤: 设计描述: 数据库设计不同阶段形成的数据库各级模式: 数据库设计的特点: 需求分析 分析和表达用户需求: 首先把任何一个系统都抽象为: 分解处理功能和数据: 分解处理功能: 将处理功能的具体内容分解为若干子功能 分解数据: 处理功能逐步分解同时,逐级分解所用数据,形成若干层次的数据流图 表达方法: 处理逻辑:用判定表或判定树来描述 数据:用数据字典来描述 将分析结果再次提交

数据库设计步骤

SQL笔记 --- 数据库设计步骤 转自:http://www.cnblogs.com/kzloser/archive/2012/07/13/2589652.html#a2 目录 总体设计过程需求分析概念结构设计逻辑结构设计数据库物理设计数据库实施数据库运行和维护 总体设计过程 数据库设计步骤: 设计描述: 数据库设计不同阶段形成的数据库各级模式: 数据库设计的特点: 需求分析 分析和表达用户需求: 首先把任何一个系统都抽象为: 分解处理功能和数据: 分解处理功能: 将处理功能的具体内容分解为若

Redis—数据结构之list

Redis的列表对象底层所使用的数据结构其中之一就是list. list Redis的list是一个双端链表,其由3部分构成:链表节点.链表迭代器.链表.这一设计思想和STL的list是一样的,STL的list也是由这三部分组成.需要特别说明的是Redis用C语言实现了list的迭代器,比较巧妙,下面就来分析list源码. list节点 节点的值为void*类型,从而可以保存不同类型的值,甚至是另一种类型的对象. // 双端链表的节点 typedef struct listNode { stru

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

【内核数据结构】 内核链表分析

一.简介: Linux中的链表使用两个指针,可以方便的构成双向链表,实际上,通常它都组织成双向循环链表,不同于数据结构书上的链表,这里的节点只有链表指针,没有链表的数据,下边我将对内核中使用的 include/linux/list.h 进行函数说明和生动的图形解释. 二.函数: 我们先来看看 1. 链表数据结构 list_head 的定义: [cpp] view plain copy print? struct list_head { struct list_head *next, *prev;

数据结构:静态查找表

数据结构:静态查找表(C语言版) 1.写在前面 ?从查找说起: 在英汉字典中查找某个英文单词的中文解释:在新华字典中查找某个汉字的读音.含义:在对数表.平方根表中查找某个数的对数.平方根:邮递员送信件要按收件人的地址确定位置等等. 从计算机.计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表.查找是许多程序中最消耗时间的一部分.因而,一个好的查找方法会大大提高运行速度. ?先讨论静态查找表: 静态查找表应该是查找中最为简单的.仅仅是在固定的表中对元素的查找,而不涉及修改表中的元素

数据结构与算法1

数据结构与算法(一),概述 转载请注明出处:http://www.cnblogs.com/wangyingli/p/5919297.html 数据结构学了有一年的时间了,但是一直没有好好的总结一下,现在回想起来,感觉好像都不怎么记得了.所以接下来一段时间我将重新学习一下,算是温故而知新了.本着「分享是一种美德」的精神,我将把我的学习总结记录下来,并与大家分享. 本节的主要内容有: 一.数据结构 1.定义 2.关于数据结构的几个术语 3.逻辑结构与物理结构 二.抽象数据类型 三.算法 四.算法的复