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){

    Console.WriteLine(SwapStringFunc);

}

++++我们可以采用根类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#事件https://blog.csdn.net/vrunsoftyanlz/article/details/78631267

++++C#委托https://blog.csdn.net/vrunsoftyanlz/article/details/78631183

++++C#集合https://blog.csdn.net/vrunsoftyanlz/article/details/78631175

++++C#泛型https://blog.csdn.net/vrunsoftyanlz/article/details/78631141

++++C#接口https://blog.csdn.net/vrunsoftyanlz/article/details/78631122

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

++++C#中System.String类https://blog.csdn.net/vrunsoftyanlz/article/details/78630945

++++C#数据类型https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity3D默认的快捷键https://blog.csdn.net/vrunsoftyanlz/article/details/78630838

++++游戏相关缩写https://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++Unity引擎基础https://blog.csdn.net/vrunsoftyanlz/article/details/78881685

++++Unity面向组件开发https://blog.csdn.net/vrunsoftyanlz/article/details/78881752

++++Unity物理系统https://blog.csdn.net/vrunsoftyanlz/article/details/78881879

++++Unity2D平台开发https://blog.csdn.net/vrunsoftyanlz/article/details/78882034

++++UGUI基础https://blog.csdn.net/vrunsoftyanlz/article/details/78884693

++++UGUI进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78884882

++++UGUI综合https://blog.csdn.net/vrunsoftyanlz/article/details/78885013

++++Unity动画系统基础https://blog.csdn.net/vrunsoftyanlz/article/details/78886068

++++Unity动画系统进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78886198

++++Navigation导航系统https://blog.csdn.net/vrunsoftyanlz/article/details/78886281

++++Unity特效渲染https://blog.csdn.net/vrunsoftyanlz/article/details/78886403

++++Unity数据存储https://blog.csdn.net/vrunsoftyanlz/article/details/79251273

++++Unity中Sqlite数据库https://blog.csdn.net/vrunsoftyanlz/article/details/79254162

++++WWW类和协程https://blog.csdn.net/vrunsoftyanlz/article/details/79254559

++++Unity网络https://blog.csdn.net/vrunsoftyanlz/article/details/79254902

++++设计模式简单整理https://blog.csdn.net/vrunsoftyanlz/article/details/79839641

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

++++UML类图https://blog.csdn.net/vrunsoftyanlz/article/details/80289461

++++Unity知识点0001https://blog.csdn.net/vrunsoftyanlz/article/details/80302012

++++U3D_Shader编程(第一篇:快速入门篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372071

++++U3D_Shader编程(第二篇:基础夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372628

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


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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值