泛型结构

泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..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#高级编程三十天----泛型结构,泛型方法,泛型托付的更多相关文章

  1. C#编程(三十)----------泛型结构,泛型方法,泛型委托

    泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与 ...

  2. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

  3. C#高级编程六十六天----表达式树总结【转】

    https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...

  4. C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic

    DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...

  5. C#高级编程五十四天----Lookup类和有序字典

    Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...

  6. 【读书笔记】C#高级编程 第十九章 程序集

    (一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...

  7. 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)

    原文出处:http://www.cnblogs.com/xun126/archive/2011/01/13/1933838.html 泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵 ...

  8. Unix环境高级编程(三)标准I/O库

    标准I/O库是ISO C的标准,在很多操作系统上面都实现.Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作.而对于标准I/O库,操作则是围绕流进行 ...

  9. 【读书笔记】C#高级编程 第二十二章 安全性

    (一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...

随机推荐

  1. C语言的本质(11)——指针与数组

    1.指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是"储存指针的数组 ...

  2. BestCoder Round #14

    Harry And Physical Teacher Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  3. struts2整合json要注意的问题

    昨天struts2整合json,一直出错: There is no Action mapped for namespace / and action name ... HTTP Status 404 ...

  4. Oracle Bills of Material and Engineering Application Program Interface (APIs)

    In this Document Goal   Solution   1. Sample Notes for BOM APIs   2. Datatypes used in these APIs   ...

  5. bootstrap注意事项(七)图片

    在本章中,我们将学习 Bootstrap 对图片的支持.Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图 ...

  6. asp.net 使用HttpModule记录全局错误

    以前使用Global.asax记录全局的错误日志觉得挺好用,但是如果一个解决方案下有N多个项目,每个下边都需要加一个并且代码都还是重复的,终于有一天无法再忍受这种模式,考虑到HttpModule,直接 ...

  7. C++_转换转子(4种)

    static_cast const_cast dynamic_cast

  8. Qt 圆角矩形+鼠标左键拖动窗口

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWind ...

  9. BZOJ 4016: [FJOI2014]最短路径树问题( 最短路 + 点分治 )

    先跑出最短路的图, 然后对于每个点按照序号从小到大访问孩子, 就可以搞出符合题目的树了. 然后就是经典的点分治做法了. 时间复杂度O(M log N + N log N) -------------- ...

  10. 正选反选JS

    JS <script> window.onload=function(){ var oTher=document.getElementById('other'); var oCheck=d ...