今天我们来学习在C#的泛型技巧,传统的课本都在讲解什么是泛型,然后列举一大堆代码示例告诉你什么是泛型,今天我们就来聊聊更加本质的东西,我为什么要用泛型?它是来解决什么问题的?底层原理是什么?

简单来说,泛型解决的是什么问题呢?算法重用和提升性能的。

最最经典的例子是什么?就是微软支持的List<T>类型,想必绝大多的程序员都是使用过这个类的。如果没有这个类,我们可以想象下,如果要你开发一个算法类,支持对数组的长度动态扩展的,还支持一些普遍的数组操作的话。你会怎么写?

比如我要写  int 数据类型的数组操作功能,写了一遍的 ListInt 类,如果这时候我们需要写一个 float 类型的数组操作对象,我们又得写一遍 ListFloat, 也就是说,每用到一个新的类型的时候,都需要写一遍类,而这之间的代码绝大部分都是相似的。

你可能会提出我搞一个 ListObject 类就可以了,这样就可以满足所有的情况了,恭喜你,这真的是个很不错的想法,无论你的类型是什么?都会转换为object进行数组的操作,这样只要写一套代码就可以了。只是,当你用了一段时间之后,它会碰到2个比较麻烦的问题

1. 我实例化了 ListObject 类,Add了很多了int类型的数据,我现在要获取所有的int类型的数组,比如int[],这个比较麻烦,需要对所有object数据进行强制转换。数组的长度比较大的时候,这时候性能就很差,为什么说c和c++性能高,都是地址基于地址的操作,没有类型转换一说。

2. 我实例化了 ListObject 类,Add了很多了int类型的数据,但是我在用的时候,很容易就误以为是float类型的,从而转换失败,降低了开发的效率。

这时候我们就要让泛型出场了,List<T>类型,将数组一般的操作逻辑都进行了封装,add,remove,insert,clear,等等操作。当你需要使用int类型的时候,就可以定义List<int>的对象,当你需要short类型的时候,就可以定义List<short>对象,而且不用再转换来转换去了。

似乎除了上述的情况需要泛型外,似乎我们实际中已经不需要泛型了,答案当然是否定的、

假设,我们需要编写一个公共的方法。是对数组操作的,比如我们会写一个方法,将数组扩充到指定长度

        /// <summary>
/// 将一个数组进行扩充到指定长度,或是缩短到指定长度 ->
/// Extend an array to a specified length, or shorten to a specified length or fill
/// </summary>
/// <typeparam name="T">数组的类型</typeparam>
/// <param name="data">原先数据的数据</param>
/// <param name="length">新数组的长度</param>
/// <returns>新数组长度信息</returns>
public static T[] ArrayExpandToLength<T>( T[] data, int length )
{
if (data == null) return new T[length]; if (data.Length == length) return data; T[] buffer = new T[length]; Array.Copy( data, buffer, Math.Min( data.Length, buffer.Length ) ); return buffer;
}

这么来看,这个就特别是否写成泛型,和类型无关的情况。

之前是数组的例子,我们再来看看另一个实际的例子。我们先看看代码:

    /// <summary>
/// 操作结果的泛型类,允许带一个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T">泛型类</typeparam>
public class OperateResult<T> : OperateResult
{
#region Constructor /// <summary>
/// 实例化一个默认的结果对象
/// </summary>
public OperateResult( ) : base( )
{
} /// <summary>
/// 使用指定的消息实例化一个默认的结果对象
/// </summary>
/// <param name="msg">错误消息</param>
public OperateResult( string msg ) : base( msg )
{ } /// <summary>
/// 使用错误代码,消息文本来实例化对象
/// </summary>
/// <param name="err">错误代码</param>
/// <param name="msg">错误消息</param>
public OperateResult( int err, string msg ) : base( err, msg )
{ } #endregion /// <summary>
/// 用户自定义的泛型数据
/// </summary>
public T Content { get; set; }
}

当你的自定义类需要携带一个数据时,而这个数据可能是任意类型的时候,这时候可以使用泛型。比如这里的 OperateResult<int> 就是非常好的例子。可以用来携带任意的自定义的数据。甚至是数组

OperateResult<List<int>> 这样也是可以的。

未完待与

 

C# 泛型详解---进阶编程(七)的更多相关文章

  1. Java 中的泛型详解-Java编程思想

    Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...

  2. java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...

  3. 【转】java 泛型详解

    java 泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 ...

  4. 【转载】Java泛型详解

    [转载]http://www.importnew.com/24029.html 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考 ...

  5. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  6. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

  7. Java泛型详解(转)

    文章转自  importNew:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理 ...

  8. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  9. Java的泛型详解(一)

    Java的泛型详解 泛型的好处 编写的代码可以被不同类型的对象所重用. 因为上面的一个优点,泛型也可以减少代码的编写. 泛型的使用 简单泛型类 public class Pair<T> { ...

随机推荐

  1. win7(64)未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序

    注:本文为个人学习摘录,原文地址:http://blog.163.com/rihui_7/blog/static/2122851432013627103337825/ 1.以前在win7 64位系统上 ...

  2. 机器学习 MLIA学习笔记(一)

    监督学习(supervised learning):叫监督学习的原因是因为我们告诉了算法,我们想要预测什么.所谓监督,其实就是我们的意愿是否能直接作用于预测结果.典型代表:分类(classificat ...

  3. Python -- xlrd,xlwt,xlutils 读写同一个Excel

    最近开始学习python,想做做简单的自动化测试,需要读写excel,然后就找到了xlrd来读取Excel文件,使用xlwt来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用x ...

  4. putty xming gnome-session

    在windows里远程连接linux的最好方法. 比VNC方式好多了 1) xming启动一个窗口 2) putty 设置完X11 forwarding之后,远程登录 3) 在putty 里启动 gn ...

  5. eclipse 与 tomcat 的那些路径

    我们用mvn创建了一个web工程,同时希望在eclipse里调试开发.mvn有mvn的路径要求,eclispe有eclipse的默认路径,怎么整合二者? 首先介绍一下eclipse的默认路径. 重点在 ...

  6. 《图解Http》 10,11章:构建Web的技术, Web的攻击技术

    10.2动态HTML 通过调用客户端脚本语言js,实现对web页面的动态改造.利用DOM文档对象模型,指定想发生变化的元素. 10.22 更容易控制的DOM 使用DOM可以将HTML内的元素当作对象操 ...

  7. Dubbo项目一段时间后提供者消失

    Dubbo项目用了一段时间后发现接口不通了,错误500 打开监控中心发现提供者不见了 查看下日志文件发现报如下错 2018-08-06 15:10:18,008 [localhost-startSto ...

  8. PHP函数总结 (一)

    <?php /** * 原理: * 函数不调用不执行,定义函数时,会将 * 函数放到内存中代码段,当调用函数时去内存 * 中函数名称所在位置中执行函数体,执行完后 * 将控制权移交回给调用函数的 ...

  9. 秒杀多线程第六篇 经典线程同步 事件Event

    原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...

  10. 二叉树—-1(No.9HN省赛小题)

    题目: 1013: Prototypes analyze 时间限制: 1 Sec  内存限制: 128 MB提交: 6  解决: 4[提交][状态][讨论版] 题目描述 ALpha Ceiling M ...