zoukankan      html  css  js  c++  java
  • 泛型介绍

    值类型转换为引用类型 是装箱 ,存在堆上
    引用类型转换为值类型 是拆箱 ,存在栈上

    泛型用一个数据类型 T 来代替object,在类实例化时指定T的类型,运行时(Runtime)自动编译为本地代码,运行效率和代码质量都有很大提高,
    并且保证数据类型安全。

    public class Stack<T>

        {

            private T[] m_item;

            public T Pop(){...}

            public void Push(T item){...}

            public Stack(int i)

            {

                this.m_item = new T[i];

            }

    }

    实例化:

      Stack<int> a = new Stack<int>(100);

          a.Push(10);

          a.Push("8888"); //这一行编译不通过,因为类a只接收int类型的数据

          int x = a.Pop();

    1. 他是类型安全的。实例化了int类型的栈,就不能处理string类型的数据,其他数据类型也一样。

    2. 无需装箱和折箱。这个类在实例化时,按照所传入的数据类型生成本地代码,本地代码数据类型已确定,所以无需装箱和折箱。

    3. 无需类型转换。

    C#中数据类型有两大类:引用类型和值类型。引用类型如所有的类,值类型一般是语言的最基本类型,如int, long, struct等,在泛型的约束中,我们也可以大范围地限制类型T必须是引用类型或必须是值类型,分别对应的关键字是class和struct:

    public class Node<T, V> where T : class

            where V: struct

    泛型本质上是在编译器编译代码之前,编译器所做的一种预处理操作。
    所谓预处理操作,你可以类比以下宏命令的#define。
    比如你写了一个泛型类
    class a<T>
    {
    T a;
    }
    而class a<T>并不是一个真正的类,甚至都不会被编译到中间代码中。
    但你一旦在某处使用了诸如
    class a<int> s=new class a<int>();
    编译器就会在你实际的代码上加入
    class a<int>
    {
    int a;
    }
    这时class a<int>才是一个类,你可以把 a<int>看做类名
    所以泛型就是一个替换的作用,但是不是#define那种硬生生的替换
    在替换之前还要做很多诸如检查约束的事情。




    //简单的泛型例子,泛型方法示例
    namespace FanXin
    {
    class Program
    {
    static void Main(string[] args)
    {

    int[] col = new int[] { 1, 2, 3, 4, 5 };
    int b =6;
    //调用泛型方法
    Console.WriteLine(Fan.Find<int>(col, b));
    Console.WriteLine(Fan.Find<string>(new string[] { "a", "b", "c", "d", "e" }, "c"));
    Console.WriteLine(Fan.Find<char>(new char[]{'a','b','c','d','y','m','h','s'},'d'));
    Console.ReadLine();
    }
    }
    public class Fan
    {//非泛型类
    public static int Find<T>(T[] items,T item)
    {//泛型方法,如果查找到数据则返回位置,否则返回-1
    for(int index=0;index<items.Length;index++)
    {
    if (items[index].Equals(item)) { return index; }
    }
    return -1;
    }
    }
    }
  • 相关阅读:
    mysql之SQL入门与提升(一)
    数据库的主键和外键
    mysql项目实战经验
    浅谈设计模式
    记录下sparkStream的做法(scala)
    hive-hbase-handler方式导入hive表数据到hbase表中
    订单风险系统BI
    关于maven 把插件依赖一起打包进jar问题
    一些hbase的shell查询语句
    关于hive表同步类型问题
  • 原文地址:https://www.cnblogs.com/PeaCode/p/3865802.html
Copyright © 2011-2022 走看看