c#泛型Generic

Posted raccon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#泛型Generic相关的知识,希望对你有一定的参考价值。

泛型:是一种不确定的数据类型      

为什么要用泛型,先看一个小例子

定义两个普通方法

  public class Method
    {
        public static void ShowInt(int IntValue)
        {
            Console.WriteLine($"IntValue={IntValue}");
        }
        public static void ShowString(string StrValue)
        {
            Console.WriteLine($"StrValue={StrValue}");
        }
    }
View Code

方法在创建时就确定了参数类型,如果有10,20个类型我们要写20个方法吗?

不是,还有一种方法可以试应不同类型object

我们在写一个方法

public static void ShowObj(object ObjValue)
        {
            Console.WriteLine($"ObjValue={ObjValue}");
        }
View Code

这样一个object方法就可以      任何一个使用父类的地方都可以用子类代替,object是所有类型的父类,

那有这一个方法不就行了,为什么用泛型呢?

这样写有两个问题:

    1:装箱拆箱   (主要是c#内存分配问题,在c#程序运行时,内存分两块空间,一个是线程栈 ,一个进程堆。

值类型在栈里,引用类型在堆里。如果我们传递一个数字1,它是值类型应该是在栈里,但是我们调用方法的时候他是一个object类型的,它传递的只是一个引用,任何一个引用类型的变量保存的只是一个引用,它会指向堆内存的一块空间。

那我们传递的是一个值类型怎么变成引用类型了-------装箱    把值类型从栈里拷贝到堆里面

那我们希望用的时候是一个int是一个值类型那么就需要------拆箱  在从堆里拷贝到栈里面

)   有性能损失。

    2:类型安全问题。因为是object类型所以什么类型都能传入     没办法约束传入类型

所以就用到泛型方法: 一个方法满足不同类型的参数

方法名字后面多了个类型参数<>

public static void Show<T>(T tValue)
        {
            Console.WriteLine($"tValue={tValue}");
        }
View Code

声明时没有确定类型,调用时确定          类型参数要和参数类型一致

 

                int IntValue = 1;
                string StrValue = "Mike";
                Console.WriteLine("=====普通方法====");
                Method.ShowInt(IntValue);
                Method.ShowString(StrValue);
                Console.WriteLine("======Object======");
                Method.ShowObj(IntValue);
                Method.ShowObj(StrValue);
                Console.WriteLine("======Generic=====");
                Method.Show<int>(IntValue);
                Method.Show<string>(StrValue);

 

以上是关于c#泛型Generic的主要内容,如果未能解决你的问题,请参考以下文章

泛型(Generic)

C#中的泛型

C#泛型底层实现原理

转载:C#中的泛型

[Unity] C#中级编程 - 04 - 泛型/构造函数/ref

C#中的泛型详解