泛型应用、原理、协变逆变、泛型缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41600552/article/details/85037957

object(最初的封装各个类型参数做法)

1,任何父类的地方都可以使用之类来代替

2,object是一切类型的父类

public static void ShowObject(object oParameter)

{

Console.WriteLine("我是{0} 类,类型为:{1},参数值为: {2}",

typeof(CommonMethod).Name,oParameter.GetType().Name,oParameter);

}

3,object类型存在俩个问题;

3.1:装箱拆箱的问题

解答:object在堆里面,如果把一个int类型传递进来的值从栈里面复制到堆里面(这是装箱)

使用的时候,有需要使用对象值,又会复制到栈里面(这就是拆箱)

3.2:类型不安全问题

解答: 可能会有,应为传递对象的时候没有限制

在.netformwork2.0是推出来泛型方法,

1.什么是泛型方法:

方法名后面加上尖括号,里面是参数类型,

类型参数实际上就是一个类型T声明,方法就可以用 这个T类型了

2,泛型的使用:

CommonMethod.Show<int>(iValues); //指定好了泛型类型,就必须使用该泛型类的参数值, 调用泛型,需要指定好类型参数,

CommonMethod.Show<string>(sValues); 如果可以从类型中推断,可以省略类型参数(俗称语法糖---编译器提供的功能)

CommonMethod.Show<int>("sssss"); 类型不能冲突,比如指定好了泛型类型,你就不能写别的类型参数的值

3,泛型为什么也可以支持多种不同类型的参数?

因为泛型方法在声明是时并没有写死类型,泛型T是什么不知道,T要等着调用时才指定,正因为没写死,才拥有无限的可能。

泛型设计思想:延迟申明,推迟一切可以推迟的,一切能晚点再晚点做的事

泛型不是一个简单的语法糖是靠框架升级支持的

4,泛型方法的性能和普通方法,object方法对比区别:

泛型方法和普通方法性能做好,而且泛型方法有可以一个方法支持多种不同类型的的方法调用,是因为框架升级支持的

/// ShowGenric<T> 类 与 ShowObj(object oParter) 的对比总结

/// 泛型类可以约束,那些类型不能调用,在调用时会直接报错,而不是在编译用过,运行时才报错

///

/// 而 obj 类的方法所能什么类型都能调用不会编译报错,可以在运行时会报错,

/// 应为在该方法中做了一次类型强制转换,有些类没有继承该类所以在运行时类型转换出错

/// 这就是泛型约束的=好处

5:泛型缓存

每个不同的T,都会生成一份不同的副本适合不同类型,需要缓存一份数据 的场景,效率高,

第一次进来都会读取构造函数中创建值,而第二次进来就不会传进入构造函数中创建值,,因为已经缓存好了数据

/// <summary>

/// 一个泛型缓存方法

/// </summary>

/// <typeparam name="T"></typeparam>

public static class GetCache<T>

{

//第一次使用缓存的时候,都会先到构造函数里面执行,

//第二次该参数缓存有值得时候就不会再进入构造函数中进行读取值

private static string _TypeTime = "";

static GetCache()

{

_TypeTime = DateTime.Now.ToString("yyyyMMdd");

}

public static string Get()

{

return _TypeTime;

}

}

6:泛型方法/类:

泛型方法:为了一个方法满足不同类型的需求

泛型类:一个类满足不同类的需求

泛型接口:一个接口为了满足所有类型的接口

泛型委托: 一个委托满足所有类型需求

泛型参数:一个泛型可以使用多个泛型参数 public void Get<T,S,W>(){}

泛型类继承:需要明确指定泛型类型 public void Get:A<int>{}

不明确指定泛型类型可以这样写: public void Get<T,S>:A<T>,B<S>{}

7:泛型约束:

没有约束,很受极限性,密封类不能进行约束,应为密封类没意义,密封类没有子类或父类,以下几种约束可以放在一起使用

如果一个泛型里面有多个参数可以直接写 where T:class where S:class

基类约束:where T:BaseModel,

1,可以吧T当成基类 2,T必须是T:后面的BaseModel类 和 BaseModel 子类 为什么要约束?因为有了约束才有权利

接口约束: where T:IWorke

引用类型约束: where T:class 返回return null

值类型约束:where T:Struct 返回 return default(T)

无参数构造函数: where T:new() 返回 return new T()

猜你喜欢

转载自blog.csdn.net/weixin_41600552/article/details/85037957