C#高级编程三十天----泛型结构,泛型方法,泛型托付
泛型结构
泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与编程语言中的数字的差别(数据库中数字能够为空,编程语言中数字不可为空).由于Nullable<T>使用过于的繁琐,于是就引入了一种特殊的语法,使用个”?”运算符.例:
int? x1;
Nullable<int> x2;
x1和x2这两种方式定义是等价的.
非空类型能够转化为可空类型. (总是成功的且能够隐式转化).
可空类型能够转化为非空类型. 可空类型的值为null时就会抛出异常.(须要显示转化)
假设不进行显示转化,我们就能够使用”??”运算符.案例:
int? x1=GetNullableType();
int y1=x1?
?
0;
这样一来,当x1为null时,就会赋给y1一个0.
泛型方法
首先来看声明一个泛型方法的案例:
//声明一个泛型方法
public T getValue<T>(T t)
{
return t;
}
//调用泛型方法.注意:在调用泛型方法时,对反省方法的參数实例化
public int userMethod()
{
return this.getValue<int>(10);
}
//重载getValue方法
public int getValue(int i)
{
return i;
}
在调用的时候:int res=getValue<int>(3);
泛型推理:在调用泛型方法时。C#编译器足够聪明。基于传入的參数类型来判断出正确的类型。而且它同意全然省略类型规范,例如以下所看到的:
int res=getValue(3);
泛型方法中反省參数的约束:
public class Myclass
{
public void MyMethod<T>(T t) where T : IComparable<T>
{
//action
}
}
无法为类级别的泛型參数提供方法级别的约束。
案例:
public class Myclass<T>
{
public void MyMethod<X>(X x, T t)
where T : IComparable<T>
where X : IComparable<X>
{
//action
}
}
正确的做法是:
public class Myclass<T>
{
public void MyMethod<X>(X x, T t)
where X : IComparable<X>
{
//action
}
}
泛型參数虚方法的重写:子类方法必须又一次定义该方法特定的泛型參数,代码例如以下:
public class BaseClass
{
public virtual void Method<T>(T t)
{
}
}
public class Myclass:BaseClass
{
public override void Method<T>(T t)
{
}
}
同一时候子类中的泛型方法不能反复基类泛型方法的约束。案例:
public class BaseClass
{
public virtual void Method<T>(T t) where T : new()
{
}
}
public class Myclass : BaseClass
{
//正确写法
public override void Method<T>(T t)
{
}
//错误写法
//public override void Method<T>(T t)where T:new()
//{
//}
}
子类方法调用虚拟方法的基类实现:它必须指定要取代泛型基础方法类型所使用的类型实參。你能够自己显式的指定它。也能够依靠类型推理(假设可能的话)代码例如以下:
public class BaseClass
{
public virtual void Method<T>(T t) where T : new()
{
}
}
public class Myclass : BaseClass
{
public override void Method<T>(T t)where T:new ()
{
base.Method<T>(t);
base.Method(t);
}
}
泛型托付
泛型托付相同在定义时声明泛型类型(<T>)
托付封装的方法同一时候须要声明泛型类型.由于该方法的签名必须与托付的定义一致.
public delegate void GenDelegate<T>(T input);
GenDelegate<T> gd = DoWork;
private static void DoWork<T>(T input)
{
//do what you what
}
实例中定义了泛型托付GenDelegate。该托付封装的方法接受一个參数。不返回不论什么值,參数类型由泛型类型T指定。
总结一下,事实上非常easy,大不了就是给普通的类,方法。托付添加泛型类型的声明就变成了泛型类,泛型方法及泛型托付。
这样一来,泛型类型就能够用于类里面的成员,能够用于方法的參数,能够用于托付封装的方法。
C#高级编程三十天----泛型结构,泛型方法,泛型托付的更多相关文章
- C#编程(三十)----------泛型结构,泛型方法,泛型委托
泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与 ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C#高级编程六十六天----表达式树总结【转】
https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- C#高级编程五十四天----Lookup类和有序字典
Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...
- 【读书笔记】C#高级编程 第十九章 程序集
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...
- 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
原文出处:http://www.cnblogs.com/xun126/archive/2011/01/13/1933838.html 泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵 ...
- Unix环境高级编程(三)标准I/O库
标准I/O库是ISO C的标准,在很多操作系统上面都实现.Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作.而对于标准I/O库,操作则是围绕流进行 ...
- 【读书笔记】C#高级编程 第二十二章 安全性
(一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...
随机推荐
- Jdt Javax
http://www.javablogging.com/dynamic-in-memory-compilation/ http://www.java2s.com/Code/Java/JDK-6/Com ...
- Hibernate 、多表关联映射-多对一关系(many-to-one)
Hibernate.cfg.xml: <session-factory name="sessionFactory"> <property name="h ...
- 在centos中添加开机自启动服务
将服务的shell脚本添加到/etc/rc.d的rc.local文件的最后面,需要在服务名称的前面加上其路径. 例如我要将httpd添加到开机自启动中,需要在rc.local添加如下代码 /usr/s ...
- strcpy()、memcpy()、memmove()、memset()的内部实现
一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...
- tky项目第①个半月总结
增加tky项目开发组已经有半个月了,这半个月一直是伴随着加班度过,学习了不少东西,也有不少抱怨,这些都是宝贵的工作经验体会.有必要在此好好总结一下. 我是中途加进这个项目的.也就是说.组内其它人员已经 ...
- trim()函数IE7/8不兼容
js中重写trim()函数 <script type="text/javascript"> String.prototype.trim = function() ...
- 关于用 random 生成伪随机数的一个手笔
我在想还要不要写什么文字.确实不需要太多的文字描述吧. 前奏插一个小话题,之前在网上看到这样的冷笑话(有图的),一个程序猿调试个程序,早上怀疑某某地方的错误,下午怀疑某某地方的错误,晚上怀疑某某地方可 ...
- C++引用和函数返回值
这是老师上课讲的内容,现在把它写下来,一方面当做复习,另一方面真的想学点东西.废话不多说,先贴上测试的代码: #include <iostream.h> float temp; float ...
- leetcode First Missing Positive python
class Solution(object): def firstMissingPositive(self, nums): """ :type nums: List[in ...
- Arduino周边模块:执行部件(舵机、直流电机、步进电机)
Arduino周边模块:执行部件 Arduino周边模块:执行部件 嵌入式系统的构成 如今已经有各种各样的基于Arduino的嵌入式系统, 比如:智能小车.3D打印机.机器人,甚至还有基于Arduin ...