泛型

有了泛型,就可以创建独立于被包含类型的类和方法了.我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可.

另一个减少代码的选项是使用object类,但object类不是类型安全的,泛型类使用泛型类型,并可以根据需要用特定的类型替代泛型类型.这就保证了类型安全性:如果某个类不支持泛型类,编译器就会报错.

对于C++模版,在特定的类型实例化模板时,需要模版的源代码.相反,泛型不仅是C#语言的一种结构,而且是CLR定义的.所以,即使泛型类是在C#重定义的,也可以在VB中用一个特定的类型实例化该泛型的.

对值类型使用非泛型集合,在把值类型转换为引用类型,和把引用类型转换为值类型是,需要进行装箱和拆箱操作.

值类型存储在栈上,引用类型存储在堆上.C#类是引用类型,结构是值类型..NET很容易吧值类型转换为引用类型,所以可以在需要对象(对象是引用类型)的任意地方使用值类型.例如,int可以赋予一个对象.从值类型转换为引用类型称为装箱.如果方法需要把一个对象作为参数,同时传递一个值类型,装箱操作就会自动进行.另一方面,装箱的值类型可以使用拆箱操作准换为值类型.在拆箱时,需要使用类型强制运算符.

看下例:

var list =new ArrayList();

list.Add(44);

int i1 = (int)list[0];//这里不作强制类型会出现错误

foreach (int i2 in list)

{

Console.WriteLine(i2);

}

Console.ReadKey();

ArrayList存储对象,add()方法定义为需要把一个对象作为参数,所以要装箱一个整数类型.在读取ArrayList中的值时,要进行拆箱,把对象类型转换为引用类型.,这需要强制类型转换

拆装箱很容易实现,但性能损失比较大,遍历许多项时尤其如此.

看下例:在命名空间using System.Collections.Generic;中

var list = new List<int>();

list.Add(44);

int i1 = list[0];

foreach (int item in list)

{

Console.WriteLine(item);

}

Console.ReadKey();

List<T>类不使用对象,而是在使用时定义类型.所以不用进行拆装箱操作.

类型安全

例:

var list = new ArrayList();

list.Add(44);

list.Add("mystring");

foreach (int item in list)

{

Console.WriteLine(item);

}

Console.ReadKey();

但并不是集合中的所有元素都能转换为int类型的,这是可以使用var.

但是更好的方法是使用List<T>,在使用时就明确指定类型

泛型允许更好的重用二进制代码,泛型可以定义一次,并且可以使用许多不同的类型实例化.不需要像C++模版那样访问源代码.

案例:

var list = new List<int>();

list.Add(44);

var stringList = new List<string>();

stringList.Add("mystring");

var classList=new List<MyClass>();

classList.Add(new MyClass);

命名约定

如果在程序中使用泛型,在区分泛型类型和非泛型类型时就会有一定的帮助.下面是泛型类型的命名规则:

1.泛型类型的名称用字母T作为前缀

2.如果没有特殊的要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类型的名称.

public class List<T>{}

public class LinkedList<T>{}

3.如果泛型类型有特定的要求(例如,必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型,就应该给泛型类型使用描述性的名称:

public delegate void EventHandle<TEventArgs>(object sender,TEventArgs e);

public delegate TOutput Converter<TInput ,TOutput> (Tinput from);

public class SortedLIst<TKey,Tvalue>{};

C#编程(二十六)----------泛型的更多相关文章

  1. 二十六、Jcreator使用初步

    摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具 ...

  2. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  3. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  4. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  5. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  6. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  7. 二十六:Struts2 和 spring整合

    二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...

  8. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...

  9. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...

  10. VMware vSphere 服务器虚拟化之二十六 桌面虚拟化之View Persona Management

    VMware vSphere 服务器虚拟化之二十六 桌面虚拟化之View Persona Management 实验失败告终,启动VMware View Persona Management服务报10 ...

随机推荐

  1. kibana提示"[illegal_argument_exception] mapper [hits] cannot be changed from type [long] to [integer]"

    =============================================== 2019/1/30_第1次修改                       ccb_warlock == ...

  2. MongoDB aggregate 运用篇(转)

    http://www.cnblogs.com/qq78292959/p/4440679.html 最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregat ...

  3. 转:vue-router 2.0 常用基础知识点之router.push()

    转载地址:http://www.jianshu.com/p/ee7ff3d1d93d router.push(location) 除了使用 <router-link> 创建 a 标签来定义 ...

  4. 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)

    Universal Windows Platform(UWP)是微软Windows10专用的通用应用平台,其目的在于在统一操作系统下控制所有智能电子设备. 自从Unity 5.2之后,配合VS 201 ...

  5. [转]solver优化方法

    原文地址:http://www.cnblogs.com/denny402/p/5074212.html 到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Desc ...

  6. java 通过异常处理错误

    java的基本理念是"结构不佳的代码不能够运行" 一.概念 发现错误的理想时机是编译阶段,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决. 二.基本异常 异常情形 ...

  7. tenaorflow函数(1)

    TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测.如果检测 ...

  8. oracle用户名小写时,利用sqlplus连接

    [oracle@upright92 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Tue May 22 10:3 ...

  9. [java] DOS编译 .java 文件得到 .class 文件 并执行 以及使用外部 .jar包 时的命令

    当写一个java文件后,在DOS中进行编译与执行时,如果没有引入外来的包,那情况很简单 例如: public class hello_world { public static void main(S ...

  10. Java字符串跟ASCII码互转

    1.由于项目中遇到,在服务器端起的jar包程序,给前台发消息后,前段收到的消息出现乱码情况,所以采取在后才发消息前先把消息字符串转成ASCII码再发往前台,前台采取在收到后台消息先把ASCII码转成字 ...