asp.net 高级应用 泛型generic(定义,原理,约束,缓存,协变,逆变)

泛型generic:

1.定义:为了达到用一套代码满足多种需求。list<int> intList=new List<int>(); intlist.where<int>(i=>i >100);
public bool update<T>(T t) where T:BaseModel
{
Type type=typeof(T);
string sql=SqlBuilder<T>.GetUpdateSql() + t.id;
int iresult = this .ExecuteSql<int>(sql,para);
}

空接口是为了达到约束标记实体类型;

泛型引入,语法,调用:
泛型设计,原理,性能:
泛型缓存:

2.泛型编译原理:任何父类出现的地方都可以用子类来替换,object 是一切类的父类;object 有装箱拆箱的内存操作性能损耗,有类型安全问题;
c#代码通过VS编译器编译为dll,exe文件,然后通过CLR/JIT编译器编译为机器码;

泛型是asp.net 2.0出现的,包括编译器以及CLR升级;
1.VS编译器升级,遇到泛型生成占位符;
2.CLR升级,JIT 支持泛型,这时类型参数已确定了,所以JIT能编译生成确定一个类型的代码;
那有什么岁月静好,只不过有人在替你负重前行。只是.net 平台进步了。
做人应:仁义礼智信,温良恭俭让。


3.泛型各种应用:
泛型方法: show<T>(T tparameter),一个参数满足不同类型,声明时不指定类型,调用方法时指定类型,称为延迟
架构师流行:推迟一切可以的推迟的。

public class GenericCache<T>

GenericCache<string>.GetData();
GenericCache<int>.GetData();
GenericCache<DateTime>.GetData();
GenericCache<object>.GetData();
GenericCache<GenericCacheTestClass>.GetData();

4.泛型约束:
1.基类约束:同一个类或子类,只能一个
public static T show<T>(T tparameter) where T:People
{
console.writeLine(tparameter.id);
console.writeLine(tparameter.name);
tparameter.breath();
}
2.接口约束:可以多个接口
public static T show<T>(T tparameter) where T:People,Isport
{
console.writeLine(tparameter.id);
console.writeLine(tparameter.name);
tparameter.breath();
}
3.引用类型约束:
public static T show<T>(T tparameter) where T:class
{
return null;
}
4.值类型约束:
public static T show<T>(T tparameter) where T:struct
{
return default(T);//根据T的类型返回默认值;
}

5.无参数构造函数约束:
public static T show<T>(T tparameter) where T:new()
{
return new T();
}

//如果直接用父类做参数,相对于泛型+约束 会少了灵活性,做不到多重约束。
showparent(people tparameter)
{
console.writeLine(tparameter.id);
console.writeLine(tparameter.name);
tparameter.breath();
}
基类约束:
1.权利:可以直接在方法里面是有基类的东西;
2.义务:类型参数必须满足约束;

GenericConstraint.Show<people>


泛型缓存:类型缓存,int,string等类型第一次都会执行,第二次执行时读缓存(不会重新执行构造函数),性能高;
字典:hash寻址(KEY VAVLUE)比较快,内存空间用的多;
List:数组结构,不适合增删改;


泛型类:
public class child<T>:GenericClass<T>,GenericInterface<T>
public class childC:GenericClass<string>,GenericInterface<int>

泛型接口:
public class childC:GenericClass<string>,GenericInterface<int>

5.泛型委托:

6.协变逆变.net 4.0:只能在接口和委托上
协变:可以左边类型参数是父类,右边参数是子类;要求T只能是返回值,不能是参数;
out :协变;
public interface IcuOUT<out T>
{
T GET();
}


in 逆变,修饰传入参数;可以左边类型参数是子类,左边类型参数是父类
要求T 只能是作为参数,不能作为返回值

public interface IcuIn<in T>
{
//T GET();
void Show(T t);
}


协变,逆变是解决这个问题的
List<Bird> blist=new List<maque>();//编译不过


逆变,协变一起用:逆变是指定传参类型,协变是指定返回值类型
public interface Ilist<int inT,out outT>
{
void show(inT t);
outT Get();
outT Do(inT t);
}
Action<int,string>


//generic泛型解决了装箱拆箱,类型安全问题
public static void show<T>(T tparameter)
{
Console.WriteLine("this is show<T>,PARAMETER={0} type={1}",tparameter,tparameter.GetType());
}

//有装箱拆箱,类型安全问题
public static void show<T,A,B,C>(T tparameter,A a,B b,C c)
{
Console.WriteLine("this is show<T>,PARAMETER={0} type={1}",tparameter,tparameter.GetType());
Console.WriteLint(a,b,c);
}

//object 是一切类的父类;object 有装箱拆箱的内存操作性能损耗,有类型安全问题;
publ static void showobject(object oparameter)
{
Console.WriteLine("this is show<T>,PARAMETER={0} type={1}",oparameter,oparameter.GetType());
}

posted @   大树2  阅读(244)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-08-02 python seaborn 画图
2012-08-02 IOS Bounds,frame,center
点击右上角即可分享
微信分享提示