.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#定义了如下类型的约束:
  • 基类约束
  • 接口约束
  • 构造函数约束
  • 引用类型约束
  • 值类型约束
 
 

.NET 泛型分析的更多相关文章

  1. Java 泛型分析

    Java 泛型 Java Generics 是 JDK 1.5 引入的新特性,它提供了编译时的类型安全检测机制,避免了代码中进行显示的类型转换(cast),是对类型系统的一种增强. Java Gene ...

  2. 第80讲:List的泛型分析以及::类和Nil对象

    今天我们学习一下scala中的列表,List. 通过源码,我们可以发现,List类型是协变的,所以我们可以把Int类型的List赋值给Any型的List. 我们可以看到,List定义下有3个比较重要的 ...

  3. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  4. okhttp +fastJson 在UI层的回调封装

    一直使用OkHttp 经常烦人的地方是回调方法  数据解析后必须通过handler 在主线程做操作 网上找了很多资料 发现有些都是基于Gson做的解析 fastJson 在封装时 泛型传入会有很多不方 ...

  5. Scala零基础教学【61-80】

    第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析 第62讲:Scala中上下文界定内幕中的隐式参数与隐式参数的实战详解及其在Spark中的应用源码解析 /** ...

  6. 对于ArrayList中的泛型进行分析

    package cn.lonecloud.reflect; import java.lang.reflect.Method; import java.util.ArrayList; public cl ...

  7. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

  8. C# Synchronized 和 SyncRoot 实现线程同步的源码分析及泛型集合的线程安全访问

    转载:http://blog.csdn.net/zztfj/article/details/5640889 Synchronized vs SyncRoot 我们知道,在.net的一些集合类型中,譬如 ...

  9. C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

随机推荐

  1. info.plist、pch和四大对象(UIApplication、UIApplicationDelegate、UIWindow、UIViewController)

    本文目录 1.程序配置文件info.plist,全局头文件pch 2.应用程序对象UIApplication介绍 3.UIApplicationDelegate介绍,程序启动过程 4.UIWindow ...

  2. 使用XML文件记录操作日志,并从后往前读取操作日志并在richTextBox1控件中显示出来

    #region 获取本地程序操作记录日志 /// <summary> /// 获取本地程序更新日志信息(由后往前读取) /// </summary> private void ...

  3. ansible-安装与使用

    1.安装ansible: 环境为centos7. 1) epel 采用阿里源的epel.安装方式连接:http://mirrors.aliyun.com/help/epel 2)yum install ...

  4. wordpress 分类相关

    分类类型,层级 wp中的分类.文章类型(post,page,video,image).标签.自定义分类.自定义标签都是分类形式.有些分类是有层级关系,有些没有.如图: taxonomy分类(categ ...

  5. 一起来做webgame,《卡片魔兽》(一)基础战斗

    写在前面的话 这不是教程,只是博主在娱乐过程中的一些小结记录.博主水平有限,没有什么高级的东西,只是将一些小的知识点结合一下,做这么一个养成类型的卡片页面游戏(=.=!有点绕).做一个完整的游戏,涉及 ...

  6. js 图片加载完后的处理事件

    //图片加载完成后再显示页面 document.getElementById('icon').onload=function(){ document.getElementById('wrap').st ...

  7. Angular-ngtable

    paginationMaxBlocks: XX, 最大显示页脚个数paginationMinBlocks: XX, 最小显示页脚个数

  8. 《linux内核设计与实现》实践之模块及深入

     <linux内核设计与实现>实践之模块及深入 写在前面的话. 基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分.由于大家都 ...

  9. EditText添加了ImageSpan后,在两者中间不能输入纯文本

    严格来说是连续插入两个ImageSpan之后,在其中间不能够输入纯文本内容. 最后发现问题出现在了SpannableString在设置ImageSpan的时候第四个参数flag的问题. spannab ...

  10. HTML5web存储之localStorage

    localStorage与cookie的作用类似,只能存储字符串,以键值对的方式进行存储:与cookie不同的是,可以存储更多的数据. localStorage用于持久化的本地存储. var skey ...