.NET 泛型解析

一、问题背景

我们在编程的时候往往因为需要处理不同类型的数据或者对象,重复编写很多类似的代码,造成代码的冗余,代码也显得不那么优雅,泛型的出现,正好是为了解决这个问题,实现继承。

示例,如下是一个现实输入值类型的类:

public class FanXing
    {
        public void F(int i)
        {
            Console.WriteLine(i+"是Int类型");
        }

}

调用:

class Program
    {
        static void Main(string[] args)
        {
            FanXing fx = new FanXing();
            fx.F(123);
            Console.ReadKey();
        }
    }

  以上示例,我们写了一个参数为int型的方法F(),其作用是输出i是int类型。上面的代码运行地很好,但是当我们需要一个参数为string类型的方法时,该怎么做?很多人会想到把方法F()复制一份,将参数类型由int改为string就可以了。这样做本身是没有问题的,但是如果我们还需要long、double类型作为参数时该怎么做呢?还是复制吗?有没有办法在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就解决了这个问题。泛型使用一个通用的数据类型T来代替object,在类实例化时指定T的类型,运行时自动编译为本地代码,运行效率和代码质量都有很大提高。

二、解决方案

    泛型是C# 2.0的一个新增加的特性,是C#编程中不可缺少的部分。它是程序设计语言的一种特性,为使用C#语言编写面向对象程序增加了极大的有效性和灵活性。它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。泛型的功能非常重要,因为通过使用泛型创建的类、结构、接口、方法和委托能过以一种类型安全的方式操作各种数据,许多算法在逻辑上是相同的。
     泛型改造后:

public class FanXing<T>
    {
        T obj;
        public void F(T t)
        {
            obj = t;
            Console.WriteLine("泛型类FanXing的一个参数的方法F"+t.ToString());
        }

public void F()
        {
            Console.Write("泛型类FanXing的无参方法F");
        }

}

     class Program
    {
        static void Main(string[] args)
        {
            FanXing<Program> f1 = new FanXing<Program>();
            FanXing<string> f2 = new FanXing<string>();
            FanXing<int> f3 = new FanXing<int>();
            f1.F();
            f2.F("hello");
            f3.F(10);
            Console.ReadLine();
        }
    }
 
    通过泛型,函数F可以传入任意参数,达到效果。
 
三、类型约束
      可以使用任意类型替换类型形参。例如:class Gen<T>{   },可以为T指定任意类型。因此,在创建Gen对象时使用int、double、string、FileStream或者任意其他类型替换T都是合法的。尽管对类型实参不加限制在大多数情况下都适用,但是在某些情况下,限制可以用作类型实参的类型也是必要的。例如,不允许使用int类型作为类型实参。为了处理某些情况,C#提供了类型约束。在指定一个类型形参是,可以指定类型形参必须满足的约束条件。通过在指定类型形参时使用where子句来实现指定。C#定义了如下类型的约束:
  • 基类约束
  • 接口约束
  • 构造函数约束
  • 引用类型约束
  • 值类型约束
 
 

最新文章

  1. Kafka:主要参数详解(转)
  2. UIkit框架之UIwebview
  3. ES6(ECMAScript 2015) 编码规范与详细注意要点
  4. Codeforces Round #382 (Div. 2) C. Tennis Championship 斐波那契
  5. 【nodejs】jade模板入门
  6. C++输入输出流的重载
  7. Kinect for Windows V2.0 新功能
  8. 第一阶段项目(3body)
  9. Exclusive-OR(带权并查集)
  10. Servlet - Listener、Filter、Decorator
  11. 循环输出ViewBag集合
  12. Python之旅Day7 面向对象&amp;异常处理
  13. 解决 双显卡 y7000笔记本 (Dual Graphics) Ubuntu 18.04 GDM3 无法外接显示器
  14. hdu 5051 找规律?+大trick
  15. Android开发工具Android Studio、Android SDK和Genymotion完全配置
  16. NIO中的Buffer
  17. 国外大神说:在编程中使用If语句的潜在危险
  18. PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)
  19. angularjs 的controller的三种写法
  20. GitLab 数据备份和恢复

热门文章

  1. jQuery验证控件jquery.validate.js使用说明+中文API
  2. Vuforia图像追踪,动态创建的对象隐藏显示的坑
  3. Linux 下 YUM 安装 Percona Server 5.6
  4. linux一些基本命令
  5. jackson注解使用心得
  6. linux nginx 启动脚本
  7. ubuntu下Pycharm安装及配置
  8. django-- Models
  9. 包管理工具Carthage使用
  10. idea使用心得(2)-安装设置与创建web项目