在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..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指定。 总结一下,其实很简单,大不了就是给普通的类,方法,委托增加泛型类型的声明就变成了泛型类,泛型方法及泛型委托。 这样一来,泛型类型就可以用于类里面的成员,可以用于方法的参数,可以用于委托封装的方法。 |
请发表评论