码迷,mamicode.com
首页 > 其他好文 > 详细

List<T>.Add(T) 引用类型与值类型

时间:2015-02-13 13:26:56      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:面向对象

问题原因:

    在考试系统中,题型的添加是由题型的组件构成的。而在题型中,选择题,则应该是由一个题型基类(题干)和四个单选按钮组成的。 这个非常容易理解。

技术分享

 

   每个组件,都对应详情信息 比如:题型基类(题型、难度等级、章节范围等) 选项(选项、是否单选、是否乱序)

 

   对于题型的添加,则是通过查询 添加的组件详情,进行拼凑。然后进行的添加。 

   如上图的题型,需要添加五条记录。(一个题干,四个选项)    四个选项里面稍有不同。

技术分享

拼出要添加的内容。

 

添加大致为:

 

   NewQuestionTypeDetails.add(题干详情)

    for (int i = 0; i < 4; i++)

    {

        NewQuestionTypeDetails.add(选项);                   

    }

 

 

添加完成后,需要对里面的各个选项  分别转换为 选项A、选项B……  以及 里面的主外键关系。

 

   //修改详情里面的外键

   foreach (var item in NewQuestionTypeDetails)

   {

       System.Guid tempQuestionTypeDetailsGuid = System.Guid.NewGuid();

       item.ExamQuestionTypeEntityQuestionTypeId = tempQuestionTypeGuid.ToString();

       item.QuestionTypeDetailsId = tempQuestionTypeDetailsGuid.ToString();

   }

 

这样的一个实体,就可以保存到数据库里面。当作该题型的详情。

但是如果是这样做的话,你会看到如下这样的信息:

技术分享

技术分享

技术分享

 

技术分享

四个选项的 默认主键,是一样的…………

 

 

对出现的问题进行分析:

 

   List<T>.add(T)   添加的是T的引用(即把T的地址添加到List中)

   这样的添加,四个选项对应的一个地址。所以在给选项添加主键的时候,添加了四次。不过是在同一个地址上。所以都被覆盖掉了,只留下最后一次的主键值。

 

技术分享

解决方案:

   在查询 选项组件的时候,把查询到的选项组件详情信息的时候。复制一份,然后在添加到新题型实体中。

 

技术分享

   NewQuestionTypeDetails.add(题干详情)

 

   for (int i = 0; i < 4; i++)

   {

       ExamQuestionTypeEntity tempCompementDetails= new ExamQuestionTypeEntity();

       tempCompementDetails=选项.clone();

       NewQuestionTypeDetails.add(tempCompementDetails);                   

   }

 

这样,主键的赋值,就不会因为地址而被重复覆盖了。当然,这种做法消耗的是内存。

 

   List<T>.add(T)  在T为实体 的时候,那么添加的就是引用类型。 

   在使用List<T>.add(T) 一定要考虑清楚,是添加引用还是添加值。不考虑这个 报的错自己都不知道如何下手了。

 

List<T>.Add(T) 引用类型与值类型

标签:面向对象

原文地址:http://blog.csdn.net/zc474235918/article/details/43792807

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!