泛型介绍(接上一篇,具体的事例随后呈上)
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类包含两个类型参数:Tkey和TValue.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 T:IComparable
{
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
- 如何从 Ring Buffer 读取?
- OEA中的AutoUI重构(1) - Command自动生成
- 开源项目Universal Image Loader for Android
- android Universal Image Loader for Android 说明文档 (1)
- 修改android最小堆内存
- (转)ES6新特性概览
- 基于OEA框架的客户化设计(一) 总体设计
- 【致敬周杰伦】基于TensorFlow让机器生成周董的歌词(附源码)
- 关于Android N的那些事
- “节流函数”提高性能
- Mono 3.0.2 基于双工通信的WCF应用 Demo
- android的适配方法
- 使用Glimpse 监测ASP.NET MVC网站
- IPv6 socket编程下--实现篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试官:JDK、JRE、JVM 三者什么关系?
- 面试官:什么是面向对象?
- 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
- 面试官:什么是字节码?它最大的优势是什么?
- 数组转List,一定要小心这个坑!
- 【小白学PyTorch】5.torchvision预训练模型与数据集全览
- 实战 | Python爬取B站柯南弹幕+Gephi梳理主线剧情
- Docker 部署SpringBoot项目不香吗?
- 面试官写了个双冒号::问我这是什么语法?Java中有这玩意?
- 精解四大集合框架:List核心知识总结
- 【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
- 【深度学习】迁移学习理论与实践
- 使用OpenCV+Tensorflow跟踪排球的轨迹
- 基于OpenCV的手掌检测和手指计数
- 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理