泛型结构

泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..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指定。

总结一下,其实很简单,大不了就是给普通的类,方法,委托增加泛型类型的声明就变成了泛型类,泛型方法及泛型委托。

这样一来,泛型类型就可以用于类里面的成员,可以用于方法的参数,可以用于委托封装的方法。

C#编程(三十)----------泛型结构,泛型方法,泛型委托的更多相关文章

  1. C#高级编程三十天----泛型结构,泛型方法,泛型托付

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

  2. java 面向对象(三十四):泛型三 自定义泛型类、泛型接口、泛型方法

    1.举例: [Order.java] public class Order<T> { String orderName; int orderId; //类的内部结构就可以使用类的泛型 T ...

  3. java 面向对象(三十五):泛型在继承上的体现

    泛型在继承上的体现: /* 1. 泛型在继承方面的体现 虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系. 补充:类A是类B的父类,A< ...

  4. java 面向对象(三十二):泛型一 泛型的理解

    1.泛型的概念所谓泛型,就是允许在定义类.接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型.这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量.创建对象时确定 ...

  5. java 面向对象(三十六):泛型五 通配符

    1.通配符的使用 /* 通配符的使用 通配符:? 类A是类B的父类,G<A>和G<B>是没关系的,二者共同的父类是:G<?> */ @Test public voi ...

  6. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器

    第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...

  7. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  8. Delphi 泛型(三十篇)

    Delphi 泛型(三十篇)http://www.cnblogs.com/jxgxy/category/216671.html

  9. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

随机推荐

  1. laravel队列,事件简单使用方法

    A.队列的使用 1.队列配置文件存储在 config/queue.php 根据自己的情况进行配置 2..env文件 QUEUE_DRIVER=database(根据个人情况配置,redis等) 3.创 ...

  2. LOJ 10127 -「一本通 4.3 练习 1」最大数

    题面 题目描述 给定一个正整数数列 $a_1, a_2, a_3, \dots , a_n$,每一个数都在 0~p-1之间.可以对这列数进行两种操作: 添加操作:向序列后添加一个数,序列长度变成 n+ ...

  3. OI 助手 | 简洁快速的 OI 工具箱 (原 竞赛目录生成)

    原竞赛目录生成 (4.0 版本前) 开发者:abc2237512422 OI 助手是一个轻量简洁的 OI 工具箱.你可以使用它来快速进行 OI 竞赛中一些繁琐的操作,例如生成竞赛目录.对拍.它为你省去 ...

  4. 【BZOJ】3456: 城市规划(多项式求ln)

    题解 在我写过分治NTT,多项式求逆之后 我又一次写了多项式求ln 我们定义一个数列的指数型生成函数为 \(\sum_{i = 0}^{n} \frac{A_{i}}{i!} x^{i}\) 然后这个 ...

  5. HDU 6249 Alice’s Stamps

    [题目链接] 题目大意: 说有$m$个区间,要求选出不超过$k$个区间,使这些区间覆盖的长度最长,问最长长度是多少. 题解: 所有区间按$R$从小到大排序之后可以进行$dp$. $dp[i][j]$表 ...

  6. mysql分库分表那些事

    为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...

  7. Windows栈溢出原理

    1.栈是什么? 栈是一种运算受限的线性表 其限制是仅允许在表的一端进行插入和删除运算 这一端称为栈顶(TOP),相对的另一端称为栈底(BASE) 向一个栈插入新元素,称作进栈.入栈或压栈(PUSH) ...

  8. Win10 主题 美化 动漫

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha  313134555@qq.com High School D×D 塔城白音Win7主题+Win8主题+Win10主题 Win10 ...

  9. codevs 2821 天使之城

    题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道,可存放5辆火车.已知从A进入车站顺序为1.2.3…….现在给你 ...

  10. HDU.3311.Dig The Wells(DP 斯坦纳树)

    题目链接 \(Description\) 有n座庙.一共n+m个点,可以在任意一些点修建水井,不同位置花费不同:也可以某些点之间连无向边共享水.求使n座庙都有水的最小花费. \(Solution\) ...