C#泛型

C#泛型

++什么是泛型数据库

++++咱们在编写程序时常常遇到两个模块的功能很是类似,只是由于参数类型不一样,因此分别写多个方法处理每种数据类型,由于方法的参数类型不一样无法重用一样功能的代码。 例如:编程

public static void Swap(ref int num, ref int num2){设计模式

    Console.WriteLine(SwapIntFunc);安全

}网络

public static void Swap(ref double num1, ref double num2){性能

    Console.WriteLine(SwapDoubleFunc);学习

}动画

public static void Swap(string num1, string num2){spa

    Console.WriteLine(SwapStringFunc);.net

}

++++咱们能够采用根类Object,来解决这个问题:

public static void Swap(object obj1,object object2){

    Console.WriteLine(SwapObj);

    Console.WriteLine(obj1.ToString() + obj2.ToString());

}


++采用Object存在如下缺陷:

++++1、会出现装箱、拆箱操做,这将在托管堆上分配和回收大量的变量,若数据量大,则性能损失很是严重。

++++2、在处理引用类型时,虽然没有装箱和拆箱操做,但将用到数据类型的强制转换操做,增长处理器的负担。


++泛型

++++C#中的泛型可以将类型做为参数来传递,即在建立类型时用一个特定的符号如“T”来做为一个占位符,代替实际的类型,等待在实例化时再用一个实际的类型来代替:

 

public static void Swap<T>(ref T value0,ref T value1){

    T temp = value0;

    value0 = value1;

    value1 = temp;

    //备注: 泛型是2.0C#语言和公共语言运行库(CLR)中的一个新功能。

}


++泛型的优势

++++1、使用泛型能够的重用代码,保护类型的安全以及提升性能。

++++2、下降强制转换或装箱操做的成本和风险。

++++3、能够对泛型参数进行限定以访问特定数据类型的方法。


++泛型类型参数

++++在泛型类型或方法定义中,类型参数是客户端在实例化泛型类型的变量时指定的特定类型的占位符。在上面例子泛型方法当中T即为泛型类型参数。


++泛型类型参数注意点

++++1、泛型类型参数能够有多个。

++++2、泛型类型参数能够是编译器识别的任何数据类型。

++++3、泛型类型参数命名须要遵照命名规则:

--1)使用描述性名称命名泛型类型,而且使用T做为前缀。

--2)单个字母名称彻底可让人了解其表示的含义使用单个大写字母命名。


++泛型类型参数的约束

++++在定义泛型类时,能够对客户端代码可以在实例化类时用于类型参数的类型种类施加限制。 若是客户端代码尝试使用某个约束所不容许的类型来实例化类,则会产生编译时错误。 这些限制称为约束。

-- where关键字: 在C#中对泛型类型参数的约束使用where上下文关键字。


++泛型类型参数经常使用的约束类型

++++1where T:struct: 表示泛型T是值类型(小数,整数,charboolstruct

++++2where T:class: 表示泛型T是引用类型。

++++3where T:new(): 表示这个泛型具备一个无参数的构造方法,若是有多个约束,new()必须放在最后。

++++4where T:基类名: 表示这个泛型是该基类或者其派生类。

++++5where T:接口名: 表示泛型是实现了该接口的类型。


++使用约束的好处

++++经过约束类型参数,能够增长约束类型及其继承层次结构中的全部类型所支持的容许操做和方法调用的数量。

++++注意: 能够对多个参数应用约束,也能够对同一参数进行多个约束。

++++例如:

class Test<T, U>

    Where U: struct

    Where T:Base,new(){}


++未绑定的类型参数

++++1、未绑定的类型参数是指那些没有约束的类型参数。

++++2、不能使用!===运算符,由于没法保证具体类型参数能支持这些运算符。

++++3、能够在它们与System.Object之间来回转换,或将它们显示转换为任何接口类型。

++++4、能够将它们与null进行比较。将未绑定的参数与null进行比较时,若是类型参数为值类型,则该比较将始终返回false


++泛型方法

++++泛型方法是使用泛型类型参数声明的方法,当方法中存在某些参数的类型不明确的时候就可使用泛型方法。未知具体类型的参数就使用泛型类型参数替代。

++++格式: 访问修饰符 返回值类型 方法名<泛型类型参数>(参数列表){

               方法体。

}

++++例如:

public static string CombineToString<T>(T value1, T value2){

    return value1.ToString() + value2.ToString();

}

++++调用泛型方法: 对象/.方法名<具体类型>(实参)

public static void Main(string[] args){

    Console.WriteLine(CombineToString<int>(234, 56));

}  //结果输出为:  23456


++重载

++++泛型方法支持使用多种泛型类型参数进行重载。

++++例如: 下面方法能够所有位于同一个类里面

void DoWork(){}

void DoWork<T>(){}

void DoWork<T, U>(){}


++泛型类

++++泛型类封装了不是特定于具体数据类型的操做,当类中存在未知参数类型的时候就可使用泛型类。

++++格式: 修饰符class类型<泛型类型参数>{

               类成员

}

++++例如:class BaseNodeGeneric<T>{ }


++泛型类实例化:

BaseNodeGeneric<int> bng0 = new BaseNodeGeneric<int>();

BaseNodeGeneric<string> bng1 = new

BaseNodeGeneric<string> ();




#立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++立钻哥哥推荐的拓展学习连接(Link_Url

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++C#事件http://www.javashuo.com/article/p-zmwruvql-gm.html

++++C#委托http://www.javashuo.com/article/p-uozpymaf-gh.html

++++C#集合http://www.javashuo.com/article/p-sfqfdqsf-ex.html

++++C#泛型http://www.javashuo.com/article/p-xrttqngo-ee.html

++++C#接口http://www.javashuo.com/article/p-vhlfplgv-dm.html

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类http://www.javashuo.com/article/p-olslkfao-cq.html

++++C#数据类型http://www.javashuo.com/article/p-hmabbtmc-ba.html

++++Unity3D默认的快捷键http://www.javashuo.com/article/p-wuwcrclr-s.html

++++游戏相关缩写http://www.javashuo.com/article/p-mwacxwca-gm.html

++++Unity引擎基础http://www.javashuo.com/article/p-beommoeb-ka.html

++++Unity面向组件开发http://www.javashuo.com/article/p-eigmuvut-dt.html

++++Unity物理系统http://www.javashuo.com/article/p-nqvvciwv-kd.html

++++Unity2D平台开发http://www.javashuo.com/article/p-ycaagdtj-hs.html

++++UGUI基础http://www.javashuo.com/article/p-rukxwckw-mc.html

++++UGUI进阶http://www.javashuo.com/article/p-wcatruhq-gt.html

++++UGUI综合http://www.javashuo.com/article/p-dkccmqii-gg.html

++++Unity动画系统基础http://www.javashuo.com/article/p-mbrdouxy-dq.html

++++Unity动画系统进阶http://www.javashuo.com/article/p-aqaqpbkh-bp.html

++++Navigation导航系统http://www.javashuo.com/article/p-dswwllas-t.html

++++Unity特效渲染http://www.javashuo.com/article/p-ckojjyfj-bp.html

++++Unity数据存储http://www.javashuo.com/article/p-bvlzynso-m.html

++++Unity中Sqlite数据库http://www.javashuo.com/article/p-ejutsbxl-ca.html

++++WWW类和协程http://www.javashuo.com/article/p-dbwmhsav-cy.html

++++Unity网络http://www.javashuo.com/article/p-sqrlntgh-dw.html

++++设计模式简单整理http://www.javashuo.com/article/p-rngqugib-hg.html

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++UML类图http://www.javashuo.com/article/p-sxberuew-bm.html

++++Unity知识点0001http://www.javashuo.com/article/p-ryvdxxjr-ep.html

++++U3D_Shader编程(第一篇:快速入门篇)http://www.javashuo.com/article/p-kyppgrac-gz.html

++++U3D_Shader编程(第二篇:基础夯实篇)http://www.javashuo.com/article/p-qkyowtli-hv.html

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/


--_--VRunSoft:lovezuanzuan--_--