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

在做项目数据同步开发的时候,我碰到一个很奇怪的显现。我首先从数据库获取数据集DataSet然后用Model把数据封装,然后放到List中,最后我遍历List时发现,它里面只放了最后一条数据封装的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> 中只是保存了一个指向地址指针。

东莞网站建设www.zg886.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值