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