.net core高级进阶2

1 .net开发中无处不在的泛型

1.1.引入泛型:延迟声明

泛型其实就是带尖括号的;在声明的时候还有可能带有

1.任何父类出现的地方,都可以用子类来代替;
2.Object是一切类型的父类;

注意:装箱拆箱对性能的损耗非常大(装箱拆箱,实际上是对栈和堆的操作)

//比较下面两种方法

public class ShowA(object obj)//通过装箱和拆箱的方式,会增加性能的消耗
{
	
}

public class ShowB<T>(T tparameter)//完美实现了ShowA,并且不会增加性能的消耗;
{
	
}

1.2.如何声明和使用泛型

声明方法给定一个尖括号;还需要声明一个类型参数T:

public class ShowB<T>(T tparameter)
{
	
}

1.3.泛型的好处和原理

CLR:公共语言运行库
JIT:即时编译,会把泛型(占位符)给替换掉,明确具体类型;

C#高级语言 --> 编译器编译 --> DLL/EXE --> CLR/JIT --> 机器码010101

CLR/JIT:用于兼容所有机器(winds、mac…)和所有位数的计算机(winds32、winds64…);例如:运行到泛型类时,编译器编译的时候,不确定类型,会针对于泛型给定一个占位符:`1(飘点1)转换成对应的类型后进而运行对应的代码片段 ;

泛型在.NetFramwork2.0版本推出;泛型是框架升级所支持,泛型不是语法糖;

执行速度比较 for(int i = 0; i < 100000000 ; i++)
普通int
object
泛型T
相同计算代码片段,执行时间长短比较 【object > 普通int 大于或约等于 泛型T】

1.4.泛型缓存

循环第一次,每一种类型指定都去执行了静态构造函数
循环第二次,没有执行静态构造函数;
原因:静态构造函数会被CLR调用,对于同一个类型整个进程中静态构造函数只执行一次;
核心:为每一个泛型类型生成一个副本普通类,在使用泛型缓存的时候,其实相当于调用了一个副本普通类;其效率要远远高于普通缓存;

泛型缓存的应用?

///每个不同的T,都会生成一份不同的副本
///适合不同的类型需要缓存一根数据的场景,这样提高效率
public class GenericCache<T>//定义泛型缓存类
{
	Private static string _TypeTime="";
	
	pulic GenericCache()
	{
		_TypeTime = string.Frormat("{0}_{1}",typeof(T).FullName, DateTime.Now.ToString("yyyyMMddHHmmss.ffff"));
	}
	
	Public static GetCache()
	{
		return _TypeTime;
	}
}

1.5揭秘泛型方法

一个泛型方法满足不同的类型的需求;这就是泛型方法;

1.6揭秘泛型类

一个泛型类,在使用的时候可以实例化出很多种不同的类;

//普通类的继承
public class childTest : ParentTest
{}

//泛型类的继承
//子类必须继承父类泛型;GenericTest<S>中的S依赖于childGenericTest<S, M, H>中的S
public class ChildGenericTest<S, M, H> : GenericTest<S>
{
	//普通
	public int Show(S s)
	{
		return 1;
	}
	//泛型
	public S Show()//++++++++当返回类型依赖于泛型时,返回值只能是此泛型;++++++
	{
		return default(S);
	}
}
public class main
{
	ChildGenericTest<int, string, DateTime> child = new ChildGenericTest<int, string, DateTime>();
}

1.7揭秘泛型接口

泛型接口:一个接口可以满足不同类型的需求;

public Interface GenericInterface<S>
{
	public S Show()
	{
		retrun defult(S);
	}
}

1.8揭秘泛型委托

一个委托可以满足不同的类型的需求

Action<int> action = s=>Console.WriteLine(s);
Action<string> action = s=>Console.WriteLine(s);

1.9类型安全

1.9.1 object //大门常打开,欢迎;这种方式容易在编译时虽然不会出错,但是会存在类型转换问题;

public static void Show(object  tparameter)
{}

1.9.2 泛型T//添加泛型约束,可以避免类型转换安全问题;在编译前就直接报错;见1.10章节

1.10揭秘泛型约束

添加相应的约束,可以在1.9章节中避免编译错误,更加直观的告诉程序员哪里有隐患;

1.10.1 添加where基类约束,

public static void Show<T>(T tparameter) where T : People
{}

1.10.2 接口约束

//限定T 是IPeople接口或者是IPeople实现类
public static void Show<T>(T tparameter) where T : IPeople //+++ where T:IPeople+++
{}

1.10.3 引用类型约束

约束T 必须是引用类型

//这里考虑到值类型和引用类型
//值类型:int,bool,emnu,Struct,可空类型(有默认值)。
//引用类型:String,用户Class,interface,array,object,delegate。

//1.引用类型约束
public static void ShowClass<T>(T tparameter) where T : class
{}

//2.值类型约束
public static void ShowStruct<T>(T tparameter) where T : struct
{}

//3.无参数构造函数约束
public static void ShowNewt<T>(T tparameter) where T : new()// new()表示泛型T中存在无参数构造函数
{}

泛型约束有什么意义?

  1. 不会有类型安全问题
  2. 让开发者更加合理分配程序功能,程序更加清晰合理,灵活运用;

如何应用泛型约束?
答:根据业务需求灵活选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值