当前位置:首页 > Windows程序 > 正文

泛型结构,泛型方法,泛型委托

2021-05-24 Windows程序

泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与编程语言中的数字的区别(数据库中数字可以为空,编程语言中数字不可为空).因为Nullable<T>使用过于的繁琐,于是就引入了一种特殊的语法,使用个”?”运算符.:

int? x1;

Nullable<int> x2;

x1x2这两种方式定义是等价的.

非空类型可以转化为可空类型. (总是成功的且可以隐式转化).

可空类型可以转化为非空类型可空类型的值为null时就会抛出异常.(需要显示转化)

如果不进行显示转化,我们就可以使用”??”运算符.案例:

int? x1=GetNullableType();

int y1=x1??0;

这样一来,x1null,就会赋给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

}

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70434.html