1、什么是泛型?

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写

代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。

2、泛型的运用

使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。
泛型最常见的用途是创建集合类。
.NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。
您可以创建自己的泛型接口、 泛型类、泛型方法、泛型事件和泛型委托。
可以对 泛型类进行约束以访问特定数据类型的方法。
关于泛型 数据类型中使用的类型的信息可在运行时通过反射获取。

3、泛型的类型

大概有以下几个集合类型:

(1). List,这是我们应用最多的泛型种类,它对应ArrayList集合。

(2). Dictionary,这也是我们平时运用比较多的泛型种类,对应Hashtable集合。

(3). Collection对应于CollectionBase

(4). ReadOnlyCollection 对应于ReadOnlyCollectionBase,这是一个只读的集合。

(5). Queue,Stack和SortedList,它们分别对应于与它们同名的非泛型类。

4、泛型的简单举例

这个类是Person类的操作类,可以自由的增加或删除Person类.如果现在要为其他的类写一个功能与这个类一样的操作类,相信只需要将Person类替换一下就可以了.不过在了解泛型之后你就可以这样来用.

List<Person> persons = new List<Person>();

persons.Add(new Person());

Person person = persons[0];

比如,如果要将Person类换成Employee类,只需要像这样写.

List<Employee> employees= new List<Employee>();

employees.Add(new Employee());

Employee employee= employees[0];

List是C#中已经定义好的泛型类,现在我们可以自己定义它.

5、运用到实例中,使用泛型和非泛型的举例

class Program
    {
        static void Main(string[] args)
        {
            #region 使用非泛型ArrayList
            /*ArrayList array = new ArrayList();
            array.Add(10);//int是值类型,而Add方法只接受引用类型(object),所以对值类型进行了装箱操作(object(10))
            array.Add("刘能");
            array.Add(DateTime.Now);//DateTime是值类型,而Add方法只接受引用类型(object),所以对值类型进行了装箱操作
            Person p = new Person();
            p.Name = "藤香";
            p.Age = 20;
            array.Add(p);

//double mianji = Math.PI * (int)array[0]*(int)array[0];
            double mianji = Math.PI * Convert.ToInt32(array[0]) * Convert.ToInt32(array[0]);
            Int32 num = 10;
            Console.WriteLine(num + num);
            Console.WriteLine(mianji);

//foreach (object obj in array)
            //{
            //    Console.WriteLine(obj);
            //}*/
            #endregion

#region 使用泛型List,凡是能够使用数组的地方,都可以使用list,哪怕你是多维数组
            List<string> list = new List<string>();
            list.Add("10");
           
            #endregion
            Console.ReadKey();
        }
    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

浅谈C#中的泛型的更多相关文章

  1. 浅谈Java中的泛型

    泛型是Java自JDK5开始支持的新特性,主要用来保证类型安全.另外泛型也让代码含义更加明确清晰,增加了代码的可读性. 泛型的声明和使用 在类声明时在类名后面声明泛型,比如MyList<T> ...

  2. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  3. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  4. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  5. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  6. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  7. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  8. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  9. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

随机推荐

  1. iOS Development: Proper Use of initWithNibName:bundle: Affects UITableViewController

    Address:http://www.outofcore.com/2011/07/ios-development-proper-use-of-initwithnibnamebundle-affects ...

  2. iOS 常用开源代码整理

    本文章不定期整理. 1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功 ...

  3. Python之路Day6

    Day6的主要内容是: configparser模块 shutil模块 subprocess模块 处理xml的模块 1.configparser模块 #! /usr/bin/env python # ...

  4. java --- 对象的创建过程

    java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候 ...

  5. AsyncTask使用须知

    AsyncTask的实现原理就是封装了的线程池,详细见AsyncTask实现原理. 在1.5中初始引入的时候, AsyncTask 运行( AsyncTask.execute() )起来是顺序的,当同 ...

  6. Javascript DOM 01 基础篇

    DOM基础   DOM是什么        答:文件对象模型(Document Object Model,简称DOM),DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构!来自网络 ...

  7. ZOJ 3492 模拟循环链表线性查找

    WA了好几次最后找到错因是因为数组开小了! = = string whose length never exceeds 20 所以至少要开到21 = = ,我却一直开20 ╮(╯▽╰)╭ AC代码: ...

  8. 06-IOSCore - KVC、CoreData

    一. KVC 1. KVC 使用前:黯淡无光 if ([keyPath isEqualToString:@"name"]) { self.labelName.text = self ...

  9. js判断IP js判断域名

    <html> <head> <script language="javascript" type="text/javascript" ...

  10. WPF Multi-Touch 开发:高级触屏操作(Manipulation)

    原文 WPF Multi-Touch 开发:高级触屏操作(Manipulation) 在上一篇中我们对基础触控操作有了初步了解,本篇将继续介绍触碰控制的高级操作(Manipulation),在高级操作 ...