.net(一) 泛型generic使用和原理 封装泛型缓存

点击返回  .net 初级高级 武林秘籍内功

大纲:

1.泛型的由来: CLR+JIT  延迟申明

2.泛型与object的对比、代码举例

3.泛型类、泛型方法、泛型接口、泛型委托

4.泛型约束

5.泛型的协变逆变

1.泛型的由来: CLR+JIT  延迟申明

泛型基本概念:.NET 泛型是一个很强大的新特性,它为每一种对象生成一份单独的代码(也就是所谓的“实例化”),这一份量身顶做的代码具有很高的效率,是强类型的,不需要运行期多态的支持和负担,有了泛型,就不再需要Object类来参与实现一些通用类或方法了.

泛型的作用: 在CLR(common language runtime)1.0中,当要创建一个灵活的类或方法,但该类或方法在编译期问不知道使用什么类,就必须以System.Object类为基础进行处理,而Object类在编译期间没有类型安全性,又必须进行强制类型转换.另外,给值类型使用Object类会有性能损失,这给程序开发带来诸多不便.故在CLR 2.0(.NET 3.5基于CLR 2.0)中,提供了泛型.

扫描二维码关注公众号,回复: 8458920 查看本文章
通过使用泛型类型,可以根据需要,用特定的类型替换泛型类型,同时保证了类型安全性:如果某个类型不支持泛型类,编译器就会报错,以阻止程度发生运行期错误.正确使用泛型将大大提高代码的灵活性,结合一个优秀的设计模式,可以显著缩短开发时间.
总而言之:泛型,其实就是 CLR+JIT的支持,使用泛型,可以重用代码,由CLR+JIT延迟等编译和执行的时候生成一个个具体的类或方法等等 的副本。比如:public class A<T>类,这样,我new的时候,var aStr= new A<string>();var aInt=new A<int>();这样,其实在编译的时候,会生成 A_001(string) 类和A_002 (int)类。 
 
 
 2.泛型与object的对比、代码举例
以上要是看的不是很懂的,例子来了。
比如我们需要打印出,传入参数的类型名称,那么使用常规代码方式,有常用2种方式去实现:
第一种,就是new对象后,调用对应的show方法,如下:
常规代码使用(令狐冲练的武功就是这样的):
/// <summary>
/// 打印个int值 
/// </summary>
/// <param name="iParameter"></param>
public static void ShowInt(int iParameter)
{
    Console.WriteLine("This is {0},parameter={1},type={2}",
        typeof(CommonMethod).Name, iParameter.GetType().Name, iParameter);
}
/// <summary>
/// 打印个string值
/// </summary>
/// <param name="sParameter"></param>
public static void ShowString(string sParameter)
{
    Console.WriteLine("This is {0},parameter={1},type={2}",
        typeof(CommonMethod).Name, sParameter.GetType().Name, sParameter);
}
/// <summary>
/// 打印个DateTime值
/// </summary>
/// <param name="oParameter"></param>
public static void ShowDateTime(DateTime dtParameter)
{
    Console.WriteLine("This is {0},parameter={1},type={2}",
        typeof(CommonMethod).Name, dtParameter.GetType().Name, dtParameter);
}

//如果做数据库查询,每一个实体对应的表,那岂不是每一个实体都要写一个方法吗?
常规代码

使用object(岳不群自宫):

/// <summary> 
///为什么用object 作为参数类型,调用的时候,可以把任何类型都传进来
///
///C#: 任何父类出现的地方  都可以用子类代替;
///Object类型是一切类型的父类
///
///Object 出现的都可以让任何类型传进来
/// 
/// 但是:有2个问题
///        性能问题:会出现装箱和拆箱;
///        类型安全问题。 
/// </summary>
/// <param name="oParameter"></param>
public static void ShowObject(object oParameter)
{
    Console.WriteLine("This is {0},parameter={1},type={2}",
        typeof(CommonMethod), oParameter.GetType().Name, oParameter);
}
使用object
 泛型类使用(小林子的葵花宝典):
/// <summary>
/// 泛型方法:需要在方法名的后面带一个<>,需要定义T, T是什么呢? 不知道, 
/// T:类型参数,只是一个占位符,类型在声明其实不确定,在调用的时候,确定类型。
///  
/// 延迟声明,推迟一切可以推迟的,事情能晚点做就晚点做。 
/// 在使用的时候,需要指定明确的类型
/// 泛型方法性能和普通方法差不多,可以用一个方法满足多个类型的需求 
/// 鱼与熊掌兼得
/// 又叫马儿跑,又叫马儿不吃草
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tParameter"></param>
public static void Show<T>(T tParameter)
{
    Console.WriteLine("This is {0},parameter={1},type={2}",
        typeof(CommonMethod), tParameter.GetType().Name, tParameter);
}
泛型方法
 

点击返回  .net 初级高级 武林秘籍内功

猜你喜欢

转载自www.cnblogs.com/Bruke/p/12143639.html