在重构机房收费系统的时候,用到了泛型集合来代替datatable的传值。但是,关于为什么要用这个泛型集合,一直以来我也没有弄明白。用的时候,也只是因为别的同学用了,而且米老师跟学长们说过了,要求传值的时候用泛型集合。直到昨天验收系统的时候,大家也谈到了这个问题,但是依然是没有一个明确的答案。
以下是本人结合前人的观点,发表一下自己的看法,如果有什么不正确的地方,欢迎大家踊跃拍砖!
1. 符合面向对象思想。
2. 实体类的属性是强类型,每个字段的类型都是已知的。
3. 操作灵活
编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。另外,不必了解数据库结构。
4. 不用拆装箱。
关于拆装箱的概念,本人早在前面写过了,所以在此不再赘述,望读者自己体会!
5. 减少输入,传输时只需要传一个实例T就可以获取它的任何属性。
6. 正确地构建的泛型类可以真正减少代码中的安全性问题。
7. 使用泛型类还可以提高性能。
其中最大的一个改进是.NET框架组件不会在值类型上使用包装(boxing)。尽管泛型类可以使用多个数据类型工作,但是它在后台单独地处理每一种数据类型。这种技术确保了在你的工作量最小的情况下,应用程序提供最佳的性能。
8. List<T>是强类型化的,而DataTable不是。
一般的DataTable,访问某列时,是通过string的ColumnName来取得的,比如:string name = dt.Rows[i]["Name"].ToString();因为name是string的列名,存在记错写错的风险,且编译不检查,而List<T>,因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。不容易出错:
string name = list[0].Name;
9. LINQ(语言集成查询)的强有力支持,使得操作List<T>有前所未有的快感
其实在LINQ出来之前,还是DataTable用的多,因为要想过滤数据,可以用
DataView,DataTable.Select()等方法。而List<T>只能是自己写循环,麻烦。
LINQ出来之后,where,join,group by,order by...等等操作,对于List<T>的查询真是很便利。
10.DataTable的结构远比List<T>要复杂,内存占用量更大。
在有变化的场合下,DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据
List<T>就没有这些累赘,更轻快。