栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

.net core高级进阶2

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.net core高级进阶2

1 .net开发中无处不在的泛型 1.1.引入泛型:延迟声明

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

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

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

//比较下面两种方法

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

public class ShowB(T tparameter)//完美实现了ShowA,并且不会增加性能的消耗;
{
	
}
1.2.如何声明和使用泛型

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

public class ShowB(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//定义泛型缓存类
{
	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依赖于childGenericTest中的S
public class ChildGenericTest : GenericTest
{
	//普通
	public int Show(S s)
	{
		return 1;
	}
	//泛型
	public S Show()//++++++++当返回类型依赖于泛型时,返回值只能是此泛型;++++++
	{
		return default(S);
	}
}
public class main
{
	ChildGenericTest child = new ChildGenericTest();
}

1.7揭秘泛型接口

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

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

1.8揭秘泛型委托

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

Action action = s=>Console.WriteLine(s);
Action 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 tparameter) where T : People
{}

1.10.2 接口约束

//限定T 是IPeople接口或者是IPeople实现类
public static void Show(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 tparameter) where T : class
{}

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

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

泛型约束有什么意义?

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

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号