泛型介绍(接上一篇,具体的事例随后呈上)

简介: 2.2接口约束为了规定某个数据类型必须实现某个接口,需要声明一个接口约束(interface constraint).有了这种约束之后,甚至不需要执行类型转换,就可以调用一个显示的接口成员实现.为了确保T类型参数都是先了IComparable接口,public class Binary where T:System.

2.2接口约束
为了规定某个数据类型必须实现某个接口,需要声明一个接口约束(interface constraint).有了这种约束之后,甚至不需要执行类型转换,就可以调用一个显示的接口成员实现.
为了确保T类型参数都是先了IComparable接口,
public class Binary<T> where T:System.IComparable{...}
编译器会确保每次使用Binary类的时候,都必须指定一个实现了IComparable接口的类型参数.

 

 

2.3 struct/class 约束

另一个重要的泛型约束是将类型参数限制为一个值类型或者一个引用类型.编译器不允许在一个约束中将System.ValueType指定成基类.相反,C#提供了特殊的语法,这种语法同时适用于引用类型.在这种语法中,不是为T指定一个基类.相反,只需要指定关键字struct或者class.

:

Public struct Nullable<T>:IFormattable,IComparable,IComparable<Nullable<T>>,INullable where T:struct

{//.......}

2.4多个约束
对于任何给定的类型参数,都可以指定任意数量的接口作为约束,但基类约束只能指定一个,因为一个类可以实现任意数量的接口,但肯定只能从一个类继承.每个新约束都在一个以逗号分隔的列表中声明,约束列表跟在泛型类型名称和一个冒号之后.如果有多个类型参数,那么每个类型名称的前面都要使用一个where关键字.如下事例,EntityDictionary类包含两个类型参数:TkeyTValue.TKey类型参数有两个接口约束,TValue类型参数有一个基类约束.:

Public class EntityDictionary<TKey,TValue>:

System.Collections.Generic.Dictionary<TKey,TValue>

Where TKey:IComparable,IFormattable

Where TValue:EntityBase

1.泛型方法
为了定义泛型方法,需要紧接在方法名之后添加类型参数语法,
public T method<T>(T params)
{
return params;
}
泛型方法也允许指定约束:
public T method<T>(T params)
where TIComparable
{
return params;
}

2.Default关键字:
要确定用于创建泛型类实例的类型,需要了解一个最基本的情况:他们是引用类型还是值类型.若不知道这个情况,就不能用下面的代码赋予null:
public class myGenericClass<T1,T2,T3>
{
T1 t1;
public myGenericClass()
{
t1=null;
}
}
如果T1是值类型,t1不能是null,所以这段代码将不会编译.幸好,我们可以用default关键字的新用法解决了它.
public myGenericClass()
{
t1=default(T1);
}
其结果是:如果t1是引用类型,就给它赋予null,如果它是值类型,就赋予默认值.如数字类型,这个默认值就是0.

几个泛型类型的示例:
2.5.1定义泛型结构
public struct myStruct<T1,T2>
{
public T1 item1;
public T2 item2;}
2.5.2 定义泛型接口
interface myInterfacee<T>{}
2.5.3.定义泛型方法
public T GetDefault<T>()
{return default(T);}
2.5.4定义泛型委托
public delegate T1 myDelegate<T1,T2>(T2 op1,T2 op2) where T1:T2

目录
相关文章
|
7月前
高等数学II-知识点(1)——原函数的概念、不定积分、求原函数的两种常用方法 (凑微分法、第二换元法)、分部积分法、有理函数原函数求法、典型三角函数原函数求法
高等数学II-知识点(1)——原函数的概念、不定积分、求原函数的两种常用方法 (凑微分法、第二换元法)、分部积分法、有理函数原函数求法、典型三角函数原函数求法
215 1
带你读《实分析(原书第4版)》之三:Lebesgue测度
本书是一部实分析方面的经典教材,主要分三部分,第壹部分为经典的实变函数论和经典的巴拿赫空间理论;第二部分为抽象空间理论,主要介绍分析中有用的拓扑空间以及近代巴拿赫空间理论;第三部分为一般的测度和积分论,即在第二部分理论基础上将经典的测度、积分论推广到一般情形。
|
存储 安全 数据安全/隐私保护
骚操作:隐藏代码到数据区,函数指针【滴水逆向三期37笔记】
骚操作:隐藏代码到数据区,函数指针【滴水逆向三期37笔记】
枚举时对数组操——三刷AcWing 95. 费解的开关
枚举时对数组操——三刷AcWing 95. 费解的开关
70 0
|
JavaScript 前端开发
学弟的一张图,让我重学了一遍函数声明和函数表达式!
首先我们要知道,当函数声明与变量命名冲突的时候,要保持着**函数声明优先的原则**
|
设计模式
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
162 0
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
|
设计模式 安全 Java
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)
148 0
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)
|
算法
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
135 0
|
算法 程序员
弄懂“三门问题”,成功概率翻倍,来用代码验证一下
弄懂“三门问题”,成功概率翻倍,来用代码验证一下
268 0
弄懂“三门问题”,成功概率翻倍,来用代码验证一下
旋转跳跃-学会操作String类数据 | 带你学《Java面向对象编程》之二十七
本节将带领读者完成对字符串数据之间的比较,并为读者介绍了字符串常量的概念与比较字符串数据的注意事项。

热门文章

最新文章