C#泛型基础知识点总结
2021-05-06 21:30
标签:c# 5.0 定义 time 鼠标 com font datetime oid 1.0 什么是泛型 泛型是C#2.0和CLR(公共语言运行时)升级的一个新特性,泛型为.NET 框架引入了一个叫 type parameters(类型参数)的概念,type parameters 使得程序在设计的时候,不必设计其具体的参数,其具体的参数可以延迟到需要的时候声明或调用。使用泛型代码运行时避免了类型转换的装箱和拆箱操作。 2.0 泛型的延迟声明 如代码所示,在声明泛型方法的时候没有指定具体的参数类型,等到需要调用的时候再指定,这就叫做延迟声明。泛型的设计思想(延迟思想,推迟一切可以推迟的)
泛型方法的调用,第一种 GenericMethod.Show(iValue);调用方法不指定类型参数,在编译的时候编译器自动编译推算(语法糖),第二种 GenericMethod.Show 3.0 泛型主要的四种:泛型类, 泛型方法,泛型接口,泛型委托 首先先新建了一个AnimalModel类,里面定义了一个动物类,动物类里有个虚方法Cry,一个狗类,狗类继承了动物类,一个猫类,重写了虚方法Cry。一个IEat接口和ISleep接口, 泛型类就在普通类名字后面加上和多个类型参数,需要注意的是 1.普通类不能直接继承泛型类和泛型接口,因为泛型的类型参数不确定,但是泛型类或泛型接口指定类型后可以继承泛型类或实现泛型接口,2.泛型类可以直接继承泛型类,也可以直接实现泛型接口,其子类的类型参数相当于声明了局部参数。 4.0泛型的约束(基类约束,接口约束,引用类型约束,值类型约束,无参构造函数约束) 回到上面写的那个GenericMethod类里的show方法,new 一个cat对象,Cat cat=new Cat(){ Id=1,Name="小黑猫"}; 然后调用genericMentod.show(cat)方法。但是如果想要在show方法里访问Id,或者Name却不行。T是个不明确类型参数,所以无法访问,如图
使用泛型约束解决方法: 5.0协变和逆变 out 协变(covariant) 修饰返回值,in 逆变(contravariant) 修饰传入参数。out和in只能放在接口或者泛型委托的的参数前面,类没有协变和逆变。在.NET Framework里面,IEnumerable
像平常一样写代码: AnimalModel animal = new AnimalModel();//实例化一个动物。 Dog dog = new Dog();//实例化一个条单身狗 AnimalModel dog2 = new Dog();//实例化一条单身狗(狗继承了动物父类,父类出现的地方都可以用子类代替,对的,狗一定是个动物) // Dog dog3 = new AnimalModel();动物不一定是条单身狗,程序编译不通过 new一条单身狗没问题,new 一群单身狗试试看。 List List animalDog = new List 理论上来说第二种实例化一群狗的方式是没毛病的,一群狗也一定是一群动物,但是程序上是不通过是因为Listt PS:写到这里我就快写不下去了,狗快被我自己玩坏了。 要使上面那句代码编译通过,可以通过lambda表达式转化 ListAnimalModel> animalDog = new List 使用IEnumerable:IEnumerable animalDog= new List 逆变就和协变相反。逆变的in 的参数只能作为传入值,不能作为返回值。说白了,也是一种约束。协变和逆变的关键作用就是让编译器在运行时不报错。 关于泛型的知识点还有很多,比如还有泛型的缓存,这个就有点难理解了。以上知识点是我平常通过各种途径学习总结的几点。如有不对欢迎指正。欢迎转载和分享,转载分享时请注明原创出处:如此拉风的女人 C#泛型基础知识点总结 标签:c# 5.0 定义 time 鼠标 com font datetime oid 原文地址:http://www.cnblogs.com/wwym/p/7646935.html 1 1 using System;
2 2 using System.Collections.Generic;
3 3 using System.Linq;
4 4 using System.Text;
5 5 using System.Threading.Tasks;
6 6
7 7 namespace _20171010Generic
8 8 {
9 9 ///
1 1 using System;
2 2 using System.Collections.Generic;
3 3 using System.Linq;
4 4 using System.Text;
5 5 using System.Threading.Tasks;
6 6
7 7 namespace _20171010Generic
8 8 {
9 9 class Program
10 10 {
11 11 static void Main(string[] args)
12 12 {
13 13
14 14 int iValue = 123;
15 15 string sValue = "TestName";
16 16 DateTime dtValue = DateTime.Now;
17 17 object oValue = new object();
18 18
19 19 GenericMethod.Show(iValue);
20 20 GenericMethod.Show(sValue);
21 21 GenericMethod.Show(oValue);
22 22 GenericMethod.Show(dtValue);
23 23 Console.WriteLine("———————我是华丽的分割线————————");
24 24 GenericMethod.Showint>(iValue);
25 25 GenericMethod.Showstring>(sValue);
26 26 GenericMethod.Showobject>(oValue);
27 27 GenericMethod.Show
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20171010Generic
{
///
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace _20171010Generic
8 {
9 ///
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace _20171010Generic
8 {
9 ///
Constraint类里的第一个show方法中在后面带个 where关键字 和 约束类型,泛型方法里就能访问Id和Name,第二个show方法是作为对比,虽然第二个方法也能实现同样的效果,但是相对泛型方法不灵活,泛型方法可以同时约束多个,比如第三个方法约束多个接口,和类,多个约束的关系是&&关系
泛型约束除了基类约束和接口约束几种,还有值类型约束,无参构造约束,引用类型约束等这几种。
1 public static T TestFun
1 public interface IMyTestout T>
2 {
3
4 }
5 public class Test
1 1 public interface IMyTest