运行时,参数类型检查。咋一看,这似乎违背了上面说到的原则,不是说要让错误的检测尽量提到编译期间,由JIT来完成么;其实并不矛盾,运行时参数的检测是为了提高代码的性能,而不是去进行异常的处理。有时候,提供的参数提供了更强大的功能,我们需要在运行时判断其类型,因为编译期间无法做到这一点(泛型的实例化是基于编译期类型而非运行期的),并利用这种类型的功能。下面的例子可以说明:
public class ReverseEnumerable<T>:IEnumerable<T>
{
private class ReverseEnumerator:IEnumerator<T>
{
//这是一个迭代器类,里面包括一个用于存放迭代数据的IList<T> 和一个int类型的游标
}
IEnumerable<T> source;
IList<T> ori;
//构造函数
public IEnumerator<T> GetEnumerator()
{
if(ori==null)
{
if(source is IList<T>)
ori=source as IList<T>;
if(source is ICollection<T>)
ori= new List<T>(source.Count);
//在上面的两种情况可以减少开销
//else copy source to ori
}
return new ReverseEnumerator(ori);
}
}
确保泛型支持可销毁对象
public void GetSomeThing()
{
T driver = new T();
using(driver as IDisposable)
{
driver.Dowork();
}
}
使用委托类型作为方法的参数,减少代码量。
下面给出一个示例,这是该书上作者给的一个示例,个人觉得蛮有启发性.
实体类Point
public class Point
{
public double X
{
get;
private set;
}
public double Y
{
get;
private set;
}
public Point(int x, int y)
{
this.X=x;
this.Y=y;
}
public Point(TextReader reader)
{
//do sonmething
}
}
操作类Action
public delegate TOutput Func<T1,T2, TOutput>(T1 arg1, T2 arg2);
public static IEnumerable<TOutput> Merge<T1,T2, TOutput>(IEnumerable<T1> left,IEnumerable<T2> right, Func<T1,T2, TOutput> generator)
{
IEnumeator<T1> ls = left.GetEnumerator();
IEnumeator<T2> rs = rigth.GetEnumerator();
while(ls.MoveNext()&&rs.MoveNext())
yield return generator(ls.Current, rs.Current);
}
使用泛型元组代替ref和out参数实现多个返回值。
熟悉C/C++开发的同仁应该经常用到指针或者引用类型的变量作为参数实现函数的多返回值。C#中为了向下兼容,引入了ref和out关键字,但是并不推荐使用。
首先,破坏了方法的单入口单出口的原则;然后,它无法对数据类型作隐式转化,因此难以实现多态,如:
public class Deliver:Base
{
}
Base a = new Deliver();
Deliver b = new Deliver();
Function(ref (Deliver)a);
Function(ref (Base)b);
使用泛型元组就可以解决这个问题,同时也符合单入口单出口的原则。
我们可以返回一个有所有返回值组成的一个泛型Tupe
using CityTemperature = Tuple<string,decimal>;
public static CityTemperature Fun(string s)
{
//....
}
分享到:
相关推荐
C#泛型 C#泛型是一种强类型机制,允许在编译时指定类型参数,从而提高代码的灵活性和可重用性。泛型可以应用于类、结构、接口和委托等多种类型。 1. 泛型类声明 泛型类声明是一个需要提供类型参数以形成实际类型...
这是我整理的C#中关于泛型的详细讲解,虽然分数高点,算是辛苦费了。
C#的泛型C#的泛型
主要介绍编写高质量的代码有助于改善C#程序,在开发过程中集合用的比较多,如何把集合使用好,在开发过程必须掌握的技巧,下面这篇文章就给大家详细介绍编写高质量代码改善C#程序——使用泛型集合代替非泛型集合...
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
谈谈关于Microsoft Visual Studio 2008中C#和java泛型的区别
很多初学C#编程的人可能对泛型列表List的使用不是很清楚,希望这个例子能帮助大家.
学S2的同学应该会遇到使用泛型集合List存储数据,并在DataGridView里显示数据。
关于如何在C#中使用泛型,希望对大家有帮助
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换
在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著提高性能并得到更高质量...
c#实现对泛型数组排序
本书延续了Effective系列图书的风格,针对 C# 2.0和 C# 3.0中添加的新特性给出了实用的建议。书中的 50个条目自成一体且又丝丝相扣,这些条目按照泛型、多线程开发、C#设计模式、C# 3.0语言增强、LINQ以及杂项等主题...
C#中关于泛型的一些讲解.............................................................
C#泛型集合使用实例C#泛型集合使用实例C#泛型集合使用实例
讓初學者很快的學會C# 2.0中泛型编程初级入门教程
C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。
C# 委托、泛型与事件 C# 委托、泛型与事件 C# 委托、泛型与事件 C# 委托、泛型与事件