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

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

2, 是一切类型的父类

public static void Show ( oParameter)

{

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

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

}

3, 类型存在俩个问题;

3.1:装箱拆箱的问题

解答: 在堆里面,如果把一个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,泛型方法的性能和普通方法, 方法对比区别:

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

/// ShowGenric<T> 类 与 ShowObj( 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: Model,

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

接口约束: where T:IWorke

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

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

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

 

收藏 打印