泛型结构

泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..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. H5新增语义化标签

    一.根据页面的结构,由div派生的标签. <header> <footer> <nav> 导航 在H4中导航栏一般用ul-li标签,H5中可以直接用<nav& ...

  2. 003_Java笔记3:Eclipse添加jar包

    本文以jedis包为例,演示Eclipse如何添加和使用jar包.   1 建立一个名为ImportJarDemo的Java Project.在该工程下建立一个libs的文件夹. 2 将下载的jedi ...

  3. 将prometheus采集的数据远程存储到influxdb中

    这个比较简单, https://docs.influxdata.com/influxdb/v1.7/supported_protocols/prometheus 只需要更改prometheus.yam ...

  4. CSS工具之CSS重置(CSS Reset)

    css代码: /* v1.0 | 20080212 */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, ...

  5. Solr7.4.0的API(Solrj)操作

    一.SolrJ的概念 solr单机版服务搭建:https://www.cnblogs.com/frankdeng/p/9615253.html solr集群版服务搭建:https://www.cnbl ...

  6. linux convert mp3 to wav and opus to wav

    link :  https://www.cyberciti.biz/faq/convert-mp3-files-to-wav-files-in-linux/ Install mpg321 or mpg ...

  7. 2019 CCPC wannfly winter camp Day 5

    C - Division 思路:我们考虑到一点,从大往小取得顺序是不会有问题的,所以可以直接主席树,但是开不下空间,我们可以log分段求. #include<bits/stdc++.h> ...

  8. bzoj 1190

    思路:分层dp,因为给的w都是a*(2 ^ b)的形式, 我们将这些物品按b分层, 我们设 dp[ i ][ j ]表示在 第 i 层 容量为(j << i)的最大值, 然后通过层与层之间 ...

  9. 005 jquery过滤选择器-----------(内容过滤选择器)

    1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. Chrome浏览器被hao123劫持,浏览器主页会被篡改为 hao123等

    先放一个知乎帖子: https://www.zhihu.com/question/21883209 我就只放几个有效解决办法了,具体的可以看上边那个帖子 方案一:     删掉桌面上的chrome图标 ...