C#高级编程三十天----泛型结构,泛型方法,泛型托付
2016-01-19 19:46
375 查看
泛型结构
泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..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,大不了就是给普通的类,方法。托付添加泛型类型的声明就变成了泛型类,泛型方法及泛型托付。
这样一来,泛型类型就能够用于类里面的成员,能够用于方法的參数,能够用于托付封装的方法。
泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..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#实现
- 跟siki老师学C#第五天
- C#之数组
- C#中常用的几种读取XML文件的方法
- C#静态构造函数和非静态构造函数
- C# 判断字符串为空的4种方法及效率
- RabbitMQ C# driver stops receiving messages
- C# 基础数据与Byte
- C#析构函数与垃圾回收
- C# 拖拽按钮移动
- C#如何加载程序运行目录外的程序集
- C# 反射研究
- C#中两个窗体将相互跳转
- c#中Show和ShowDialog的区别
- C#中堆和栈的区别分析
- c#动态生成word,在本地可以执行,但发布到iis上出错解决方案
- csharp:Microsoft.Ink 手写识别(HandWriting Recognition)
- c#操作xml文件
- 复制一个Word文档的部分或全部内容到另一个Word文档
- C# 复制一个Word文档的部分或全部内容到另一个Word文档