IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> 编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型 -> 正文阅读

[C#]编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型

编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型 建议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<T>
    {
        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个建议》陆敏技
上一篇文章      下一篇文章      查看所有文章
加:2015-08-16 16:30:59  更:2017-05-14 18:02:35 
 
  C# 最新文章
字符串阵列分别输出元素的索引,原值和长度
格式化你的字符串
C#宣告一个变量
C#中级
拆分一个字符串并把每个字符单独输出
通过手机号定位归属地
C# DBNULL与NULL之间的区别【转】
Xamarin
List,DataTable实现行转列的通用方案
C# 语音识别
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年12日历
2018-12-10 19:54:57
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库