博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
阅读量:5218 次
发布时间:2019-06-14

本文共 1750 字,大约阅读时间需要 5 分钟。

建议32:总是优先考虑泛型

泛型的优点是多方面的,无论泛型类还是泛型方法都同时具备可重用性、类型安全性和高效率等特性,这是非泛型和非泛型方法无法具备的。

 

以可重用性为例:

class MyList    {        private int[] items;        public int this[int i]        {            get { return items[i]; }            set { this.items[i] = value; }        }        public int Count        {            get { return items.Length; }        }        ///省略其他方法    }

该类型只支持整型,如果要让类型支持字符串,有一种方法是重新设计一个类。但是这两个类型的属性和方法都是非常接近的,如果有一种方法可用让类型接收一个通用的数据类型,这样代码就可以复用了,同时类型也只要一个就够了。泛型完成的就是这样一个功能。泛型实现如下:

class MyList
{ private T[] items; public T this[int i] { get { return items[i]; } set { this.items[i] = value; } } public int Count { get { return items.Length; } } ///省略其他方法 }

可以把T理解为一个占位符,在C#泛型编译生成的IL代码中,T就是一个占位符的角色。在运行时,即时编译器(JIT)会用实际代码中输入的T类型来代替T,也就是说,在由JIT生成的本地代码中,已经使用了实际的数据类型。我们可以吧MyList<T>和MyList<T>视作两个不同类型,但是,这仅是对本地代码而言,对应实际的C#代码,它仅仅拥有一个类型,那就是泛型类型MyList<T>。

 

如果不用泛型来实现,另一种方法是让MyList的编码从object的角度去设计。在C#的世界中,所有类型(包括值类型和引用类型)都是继承自object,如果让MyList足够通用,就需要让MyList针对object编码,代码如下:

class MyList    {        private object[] items;        public object this[int i]        {            get { return items[i]; }            set { this.items[i] = value; }        }        public int Count        {            get { return items.Length; }        }        ///省略其他方法    }

这会让下面的代码编译通过:

list[0]=123;

list[1]="123";

由上面两行代码带来的问题就是非类型安全性。让类型支持类型安全,可以让程序在编译期间就过滤掉部分Bug,同时,也能让代码避免“转型为object类型”或“从object转型为实际类型”所带来的性能损耗。尤其是当操作类型是值类型时,还会带来装箱拆箱的性能损耗。

 

泛型为C#语言带来了革命性的变化,FCL之后的很多功能都是借助泛型才得到很好的实现,如LINQ。LINQ借助于泛型和扩展方法,有效地丰富了集合的查询功能,同时避免了代码爆炸并提升了操作性能。我们在设计自己的类型时,应充分考虑到泛型的优点,让自己的类型成为泛型类。

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

转载于:https://www.cnblogs.com/jesselzj/p/4731964.html

你可能感兴趣的文章
python应用:爬虫实例(静态网页)
查看>>
迅为iTOP-4418开发板兼容八核6818开发板介绍
查看>>
com.fasterxml.jackson.databind.JsonMappingException
查看>>
【UVa 540】Team Queue
查看>>
排序算法(二)
查看>>
Python内置函数(36)——iter
查看>>
HTML标签_1
查看>>
jsp组成元素
查看>>
排序算法(转)
查看>>
windows自带的可生成各种数据库连接字符串工具打开方法
查看>>
Python命名规范
查看>>
滚动条
查看>>
程序员的自我修养九Windows下的动态链接
查看>>
Codeforces Round #361 (Div. 2)
查看>>
细说WebSocket - Node篇
查看>>
jenkins+testNG
查看>>
[洛谷1485] 火枪打怪
查看>>
PAT B1018.锤子剪刀布(20)
查看>>
Extjs控件之 grid打印功能
查看>>
枚举类型(不常用)递归
查看>>