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 使用标识可以验证运行应用程序 ...
随机推荐
- Delphi使用XmlHttp获取时间
uses ComObj, DateUtils; procedure TForm1.Button1Click(Sender: TObject); var XmlHttp: Variant; datetx ...
- tracker-store and tracker-miner-fs eating up my CPU on every startup
Tracker is a synergy of technologies that are designed to provide a highly sophisticated, innovative ...
- web本地存储-UserData
userData,IE中持久化用户数据的方法. 使用userData用户数据首先必须使用css指定userData行为.代码示例: var ud = document.createElement(&q ...
- java双线程调用同一个对象+锁
两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob) 误区:下一个线程会从上一个线程结束的地方开始 正解:如 public domd implements Run ...
- php set env
SYSTEM WARNING: 'date_default_timezone_get(): It is not safe to rely on the system's timezone settin ...
- Linux学习(一):linux更改ip地址命令_更改DNS_更改默认网关_更改子网掩码_主机名
如何使用命令来更改linux的IP .DNS .子网掩码,在虚拟机(vitrualBox)上添加一个Linux的虚拟机; 安装方法:http://pan.baidu.com/s/1sjJPhP7 安装 ...
- (转)iOS开发ARC内存管理技术要点
转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...
- java中表示二进制、八进制、十进制、十六进制,double、float、整型
java里不能这样表示二进制,只能是 8,10,16进制 8: 前置 0 10: 不需前置 16: 前置 0x 或者 0X double:2 ...
- 使用Cloudsim实现基于多维QoS的资源调度算法之中的一个:配置Cloudsim环境
Cloudsim是一款开源的云计算仿真软件,它继承了网格计算仿真软件Gridsim的编程模型,支持云计算的研究和开发.它是一个自足的支持数据中心.服务代理人.调度和分配策略的平台,支持大型云计算的基础 ...
- bootstrap-js(2)下拉菜单
1.下面的实例演示了在导航栏内和标签内的下拉菜单的用法: <!DOCTYPE HTML><html><head><link href="/style ...