C# 泛型(Generic)

  泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

  您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:

  using System;

  using System.Collections.Generic;

  namespace GenericApplication

  {

  public class MyGenericArray

  {

  private T[] array;

  public MyGenericArray(int size)

  {

  array = new T[size + 1];

  }

  public T getItem(int index)

  {

  return array[index];

  }

  public void setItem(int index, T value)

  {

  array[index] = value;

  }

  }

  class Tester

  {

  static void Main(string[] args)

  {

  // 声明一个整型数组

  MyGenericArray intArray = new MyGenericArray(5);

  // 设置值

  for (int c = 0; c < 5; c++)

  {

  intArray.setItem(c, c*5);

  }

  // 获取值

  for (int c = 0; c < 5; c++)

  {

  Console.Write(intArray.getItem(c) + " ");

  }

  Console.WriteLine();

  // 声明一个字符数组

  MyGenericArray charArray = new MyGenericArray(5);

  // 设置值

  for (int c = 0; c < 5; c++)

  {

  charArray.setItem(c, (char)(c+97));

  }

  // 获取值

  for (int c = 0; c < 5; c++)

  {

  Console.Write(charArray.getItem(c) + " ");

  }

  Console.WriteLine();

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  0 5 10 15 20

  a b c d e

  泛型(Generic)的特性

  使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  它有助于您最大限度地重用代码、保护类型的安全以及提高性能。

  您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。

  您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

  您可以对泛型类进行约束以访问特定数据类型的方法。

  关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

  泛型(Generic)方法

  在上面的实例中,我们已经使用了泛型类,我们可以通过类型参数声明泛型方法。下面的程序说明了这个概念:

  using System;

  using System.Collections.Generic;

  namespace GenericMethodAppl

  {

  class Program

  {

  static void Swap(ref T lhs, ref T rhs)

  {

  T temp;

  temp = lhs;

  lhs = rhs;

  rhs = temp;

  }

  static void Main(string[] args)

  {

  int a, b;

  char c, d;

  a = 10;

  b = 20;

  c = 'I';

  d = 'V';

  // 在交换之前显示值

  Console.WriteLine("Int values before calling swap:");

  Console.WriteLine("a = {0}, b = {1}", a, b);

  Console.WriteLine("Char values before calling swap:");

  Console.WriteLine("c = {0}, d = {1}", c, d);

  // 调用 swap

  Swap(ref a, ref b);

  Swap(ref c, ref d);

  // 在交换之后显示值

  Console.WriteLine("Int values after calling swap:");

  Console.WriteLine("a = {0}, b = {1}", a, b);

  Console.WriteLine("Char values after calling swap:");

  Console.WriteLine("c = {0}, d = {1}", c, d);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Int values before calling swap:

  a = 10, b = 20

  Char values before calling swap:

  c = I, d = V

  Int values after calling swap:

  a = 20, b = 10

  Char values after calling swap:

  c = V, d = I

  泛型(Generic)委托

  您可以通过类型参数定义泛型委托。例如:

  delegate T NumberChanger(T n);

  下面的实例演示了委托的使用:

  using System;

  using System.Collections.Generic;

  delegate T NumberChanger(T n);

  namespace GenericDelegateAppl

  {

  class TestDelegate

  {

  static int num = 10;

  public static int AddNum(int p)

  {

  num += p;

  return num;

  }

  public static int MultNum(int q)

  {

  num *= q;

  return num;

  }

  public static int getNum()

  {

  return num;

  }

  static void Main(string[] args)

  {

  // 创建委托实例

  NumberChanger nc1 = new NumberChanger(AddNum);

  NumberChanger nc2 = new NumberChanger(MultNum);

  // 使用委托对象调用方法

  nc1(25);

  Console.WriteLine("Value of Num: {0}", getNum());

  nc2(5);

  Console.WriteLine("Value of Num: {0}", getNum());

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Value of Num: 35

  Value of Num: 175

  本文转载自:w3cschool

  (编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 泛型(Generic)的更多相关文章

  1. 雷林鹏分享: C# 简介

    C# 简介 C# 是一个现代的.通用的.面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的. C# 是由 Anders Hejlsberg 和他的团队在 ...

  2. 雷林鹏分享:C# 基本语法

    C# 基本语法 C# 是一种面向对象的编程语言.在面向对象的程序设计方法中,程序由各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中. 例如,以 Rectan ...

  3. 雷林鹏分享:C# 接口(Interface)

    C# 接口(Interface) 接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 接 ...

  4. 雷林鹏分享:CodeIgniter 数据库操作

    在平时项目开发过程中,除了处理那些繁琐的逻辑过程外,还有一个重要的任务就是对数据库的操作处理.这里总结下自己平时使用CI过程中使用的如何对数据库进行操作处理. 在CI框架中,我们一般会把对数据库的操作 ...

  5. 雷林鹏分享:YAF路由问题

    这2天休年假,在家宅着学习研究了YAF框架,用YAF做过APP接口的项目,但是没有用来做过WEB方面的应用.趁着这2天在家想把博客用YAF进行一下改版,目的也想进一步学习一下YAF. 在这过程中遇到不 ...

  6. 雷林鹏分享:url中加号引发的错误

    刚发现了博客的一个bug,标签页中一些标签带有空格,在url输出中使用了 urlencode 函数进行处理,导致空格被转换成了加号(+),这时通过url访问时会出现错误: 临时解决方法是在urlcod ...

  7. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...

  8. 雷林鹏分享:Laravel 安装

    前面我们介绍我了 composer安装,这里我们接着来介绍 Laravel框架的安装. 这里我们安装的是laravel 4 项目下载地址:https://github.com/laravel/lara ...

  9. 雷林鹏分享:CodeIgniter常用的数据库操作类

    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类: $this->lo ...

随机推荐

  1. IO(字符流)

        1. 由于Java采用16位的Unicode字符,因此需要基于字符的输入/输出操作.从Java1.1版开始,加入了专门处理字符流的抽象类Reader和Writer,前者用于处理输入,后者用于处 ...

  2. js 内置对象和方法 示例

    JS内置函数不从属于任何对象,在JS语句的任何地方都可以直接使用这些函数.JS中常用的内置函数如下: 1.eval(str)接收一个字符串形式的表达式,并试图求出表达式的值.作为参数的表达式可以采用任 ...

  3. SNMP学习笔记之SNMPv3的配置和认证以及TroubleShooting

    0x00 增加snmp v3用户 增加用户的时候,必须要停止SNMP服务. # service snmpd stop # net-snmp-config --create-snmpv3-user -r ...

  4. PHP多进程并行执行php脚本

    <?php //fork.php $cmds = [ '/data/wwwroot/default/test1.php', '/data/wwwroot/default/test2.php', ...

  5. awk之match函数

    功能:match函数是用于个性化定制搜索模式. 例子: 文件内容: this is wang ,not wan that is chen, not che this is chen ,and wang ...

  6. 【前端】javascript实现鼠标跟随特效

    实现效果: 实现代码: <!DOCTYPE html> <html> <head> <title>鼠标跟随</title> <meta ...

  7. linux下通过命令行上传文件到百度网盘

    一.环境: centos release 6.9 python 2.7.13 二.安装工具bypy sudo pip install bypy 三.使用bypy 3.1 授权 [root@ineedl ...

  8. 地宫取宝|2014年蓝桥杯B组题解析第九题-fishers

    地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  9. 动态规划模板2|LCS最长公共子序列

    LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...

  10. spring-boot-devtools 实现热部署

    1.devtools spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot ...