当前位置: 首页 > news >正文

广州免费推广网站建设建设招标网官方网站电脑版

广州免费推广网站建设,建设招标网官方网站电脑版,人工智能写作网站,网站宣传的方式引言 在我们使用.Net进行编程的过程中经常遇到这样的场景#xff1a;对于几乎相同的处理#xff0c;由于入参的不同#xff0c;我们需要写N多个重载#xff0c;而执行过程几乎是相同的。更或者#xff0c;对于几乎完成相同功能的类#xff0c;由于其内部元素类型的不同对于几乎相同的处理由于入参的不同我们需要写N多个重载而执行过程几乎是相同的。更或者对于几乎完成相同功能的类由于其内部元素类型的不同我们需要写N多个同质化的类。对于这样的场景我们可以通过使用泛型来进行处理。 泛型的概念 泛型允许我们对类、接口、委托、方法使用一个或多个占位符来延迟声明在实际调用的时候再补充这些占位符以便让编译器对不同类型的占位符进行不同的类型编译这是一种延迟声明的思想体现。 当然以上是笔者本人的理解我们也可以采用一些大牛的理解可利用泛型创建一个数据结构该数据结构能够进行特化以处理特定的类型程序员定义这种参数化类型使泛型类型的每个变量具有相同内部算法但数据类型和方法签名可随类型参数而变。 我们经常看到泛型声明使用的占位符T而这个占位符就称为这个泛型的类型参数而实际调用这个泛型的时候这个类型参数又称为类型实参。 好了概念就到这里反正我是觉得只看概念越看越懵。 泛型的作用 泛型的作用本人理解就是能够减少代码量给予特定的类或者方法或者委托的等一种通用的代码而一套通用的代码可以适用于处理各种数据类型以避免为每种数据类型的处理声明一个类或者方法。 当然这还是容易理解要理解他的作用我们先做出这样的考虑如果没有泛型会怎样 下面比如我们有一个这样的需求 我们需要写一个方法就是在控制台打印入参(当然尽管这可能是毫无意义的)假设这个方法需要支持int,string,double三个类型。 面对这样的需求我们有两种解决方案第一种就是定义一个方法三个重载分别打印int、string、double类型的入参代码如下 static void PrintParameter(int parameter){Console.WriteLine(parameter);}static void PrintParameter(string parameter){Console.WriteLine(parameter);}static void PrintParameter(double parameter){Console.WriteLine(parameter);} 以上解决方式肯定不科学因为这样的一个简单的处理我们竟然写了三个重载代码量太多了。那么我们可以采取另外一种方式将方法的入参声明为object类型因为object类型是所有类型的基类于是能够支持各种类型的入参进而打印。 static void PrintParameter(object parameter){Console.WriteLine(parameter);} 这种方式虽然能够解决问题但是有一个性能弊端比如我们传入的类型是int,double或者结构类型这些值类型呢那么难免程序会有拆装箱操作而这样的操作是对性能有损失的。 那么有既能避免性能损失又能避免代码冗余的方式吗 泛型的作用就这样体现了 我们可以定义一个如下的方法 static void PrintParamterT(T parameter){Console.WriteLine(parameter);} 以上代码我们使用了尖括号包裹的类型参数T作为占位符在实际调用的时候我们只需要指定T的类型编译器就能够将这些占位符编译成对应的类型并且既是类型安全的又避免了拆装箱。 所以在泛型的众多应用中主要作用是两个方面1提高性能。2避免代码冗余。当然还有很多其他的作用这个我们在具体编程的时候能够体会到。 泛型的分类和对应的定义语法 泛型根据其主体的不同可以分为泛型类、泛型方法、泛型接口、泛型委托四种类型下面分别是四种类型的定义 //这是一个泛型类public class GenericClassT{//这是一个泛型方法public void GenericMethodU,P(U para1,P para2){}//这是一个泛型委托public delegate K GenericDelegateK();}//这是一个泛型接口public interface IGenericInterfaceT{} 通过观察以上简略的定义我们可以发现如下规律 1类型参数不只是可以为T也可以为其他字符或者字符串因为只是一个占位符而已叫什么名字不重要。 2一个泛型的类型参数可以不止一个可以有两个、三个甚至更多。而一个泛型的类型参数的个数我们称之为“元数”。以上案例中的GenericMethod显然是一个二元泛型方法。 3我们为类指定了类型参数之后还能为类中的方法或者委托指定另外的类型参数当然实际这种使用的情况很少。 泛型约束 在一般的使用中我们使用T类型参数来代表一切类型但是在特定的场景下我们还是希望对类型参数进行进一步的限定以进一步的保证类型安全并获得对类型参数的更高的访问权限。 这里更高的访问权限可能暂时无法理解我们举个例子 比如我们定义了一个动物类Animal代码如下 /// summary/// 定义有两个属性的动物类/// AnimalTypeName动物的种类名称如老虎/// AnimalHeight动物的身高如:10.2/// /summarypublic class Animal{public string AnimalTypeName { get; set; }public double AnimalHeight { get; set; }} 然后我们在控制台中定义了一个方法ShowName用来显示传入对象的名字用T作为类型参数因为传入的有可能是动物有可能是人 /// summary/// 事实上这个方法在语法上是不通过的因为无法确定入参t拥有AnimalTypeName属性/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t){Console.WriteLine(t.AnimalTypeName);} 以上ShowName方法在语法上绝对是错的因为我们无法确保传入的类型实参一定是Animal类型的或者说是一定拥有AnimalTypeName属性。那么既然代码已经写了我们是否可以限定类型参数的范围呢限定T必须为Animal类型。当然可以代码如下 /// summary/// 使用where T:Animal来约束类型参数T必须是Animal类型或者其子类/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T: Animal{Console.WriteLine(t.AnimalTypeName);} 我们在ShowName方法后面加入约束where T:Animal这样就限定了类型参数必须是Animal或者其子类。这个约束就叫做基类约束。 那么除了基类约束还有那些约束呢下面我们用代码予一一举例 接口约束(约束类型实参必须继承于某接口) /// summary/// 接口约束约束类型实参必须继承于某接口/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T : ICloneable{object objt.Clone();} 引用类型约束(约束类型实参必须是引用类型) /// summary/// 引用类型约束约束类型实参必须是引用类型/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T : class{} 值类型约束(约束类型实参必须是值类型) /// summary/// 值类型约束约束类型实参必须是值类型/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T : struct{} 无参构造函数约束(约束类型实参必须拥有无参的构造函数) /// summary/// 无参构造函数约束约束类型实参必须拥有无参的构造函数/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T : new(){} 多重约束(约束多个方面) /// summary/// 多重约束以下案例约束了类型参数必须为引用类型且必须继承接口ICloneable且必须有无参的构造函数/// /summary/// typeparam nameT/typeparam/// param namet/paramstatic void ShowNameT(T t) where T : class, ICloneable,new(){} 协变和逆变论述 看了很多资料就很少发现把协变和逆变讲清楚了的这里本人自己总结一下吧如果总结的不好或者有偏差望朋友们指出。 所谓协变本人认为就是和谐的变这里指子类向父类的转变。任何子类实例都可以赋值给一个父类变量这就是协变。 所谓逆变就是不和谐的变这里指父类向子类的转变父类实例给一个子类变量。 泛型中我们只可以对接口和委托使用协变和逆变。分别用关键字out和in用out修饰的类型参数只能用作返回用in修饰的类型参数只能用作输入。 下面是协变案例(虽然是毫无意义的代码)实现协变 //假设我们有两个类Dog类是Animal的子类public class Animal{public virtual void Write(){Console.WriteLine(我是基类);}}public class Dog : Animal{public override void Write(){Console.WriteLine(我是小小狗);}} 然后我们定义一个支持协变的接口和一个类(类是用来后面创建实例的因为接口无法直接new)用out关键字修饰类型参数 //支持协变的接口用out关键字修饰public interface ICovariantout T{}//写一个类继承于ICovariantpublic class CovariantT : ICovariantT{} 然后我们会发现IConveriantDog的实例能够给一个IConveriantAnimal的变量这就称为协变。子类给父类。 ICovariantDog dogCovariant new CovariantDog();ICovariantAnimal animalCovariant dogCovariant;//协变的体现 然后根据以上规律我们狭义的去总结协变所谓协变就是当用out关键字修饰了接口或者委托的类型参数之后对于该泛型子类类型参数的实例能够赋值给一个该泛型父类类型参数的变量。用伪代码表示就是IConvariantFatherClass fathernew IConvariantChildClass(); 下面我们去理解逆变逆变是刚好相反的 同样是上面的代码我们把IConvariant的类型参数修饰的关键字改成in //支持协变的接口用out关键字修饰public interface ICovariantin T//修改了类型参数的关键字{}//写一个类继承于ICovariantpublic class CovariantT : ICovariantT{} 然后我们写下如下代码 ICovariantAnimal animalCovariant new CovariantAnimal();ICovariantDog dogCovariant animalCovariant;//逆变的体现 我们会发现以上两句代码居然能够编译通过经过in关键字修饰了类型变量的泛型。其父类类型变量的泛型实例能够给一个使用了子类类型参数的泛型变量。刚好反过来了....。这就是逆变用伪代码表示IConvariantChildClass childnew IConvariantFatherClass()。 一些重点 一对于泛型也许我们对于如下代码会产生疑问 public interface ICovariantin T{}//写一个类继承于ICovariantpublic class CovariantT : ICovariantT{} 对于ConvariantT到底是继承于IConvariant的所有可能的类型参数还是只继承于相同类型参数。举个例子 CovariantAnimal到底只继承于IConvariantAnimal还是既继承于IConvariantAnimal又继承于IConvariantDog。这里本人的理解是泛型和泛型之间的继承只有相同的类型参数才有继承关系。就是CovariantAnimal到底只继承于IConvariantAnimal 二父类的泛型约束能够被子类继承吗 答案显然是否定的继承关系我们只听说继承属性方法字段没听说能继承约束的。
http://www.dnsts.com.cn/news/237355.html

相关文章:

  • 有哪些游戏可以做网站微友说是做网站维护让帮忙投注
  • 遂宁建设网站wordpress 分类排序
  • 商务网站内容维护范围做百度文库需要网站吗
  • php网站开发视频网站龙岩论坛
  • 适合新手的网站开发百度入口
  • 网站icp备案新规实用网站设计步骤
  • 网站开发有侵权吗谷歌怎么做公司网站
  • 朋友圈网站广告怎么做物联网设计与开发
  • 在线网站流量查询08r2 搭建php网站
  • 网站建设要做什么郑州网络营销网站优化
  • 免费的企业建站cms建设官方网站企业登录
  • 建立类似淘宝的网站凡科网站做的作品如何发布
  • 网站整套模板项目代码下载湖北企业模板建站开发
  • 关于学校网站建设做网站可以用哪些软件
  • 池州有哪些做网站的wordpress 虚拟数据
  • 网站建设费用首选网络申请了域名先做网站还是先备案
  • 手机网站 制作云南城市建设职业学院成绩查询网站
  • 网站建设简述常州设计公司排名
  • 织梦网站后台模板做项目的网站
  • wordpress做社区网站交友app搭建
  • 青海网站建设公司哪家好软件开发的基本
  • 怎么给网站动态做伪静态如何开发安卓app
  • 公司网站域名和空间零基础网站建设教学视频
  • 利用cms怎么做网站阿升网站免费学设计
  • 鹿泉外贸网站建设学术网站建设
  • 网站文章更新要求网站弹窗页面是谁做的
  • 建设银行网银网站激活wordpress e
  • iis7搭建网站教程怎么注销建设银行网站用户名
  • 网站建设公司那个好王也台球
  • 怎样在设计网站做图赚钱吗校园推广大使的职位描述