运行时,参数类型检查。咋一看,这似乎违背了上面说到的原则,不是说要让错误的检测尽量提到编译期间,由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)
{
//....
}
分享到:
相关推荐
但我可以根据给定的【标题】和【描述】提供一些关于《More Effective C#》这本书的知识点,希望能够满足您的需求。 《More Effective C#》中文版是一本专注于提升C#编程实践能力的书籍,它针对的是那些已经具备一定...
这本书被视为《Effective C#》的续作,延续了Effective系列图书的卓越风格,通过真实代码示例和深入的分析,为C#程序员提供了专家级的建议和技巧。书中主要围绕C# 2.0和C# 3.0的新特性,从多个角度(包括泛型、多...
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
例如,C#的泛型集合类如List在运行时可以使用非装箱的值类型,而Java的ArrayList由于类型擦除,对于非引用类型仍需进行装箱操作,这可能导致性能下降。 另一方面,Java的泛型类型擦除带来了一定的灵活性,使得旧的...
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型。很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个...
《More Effective C#》是微软开发人员出版物中的一本经典书籍,专注于C#编程语言的高级技巧和最佳实践。这本书由比尔·贝克(Bill Wagner)撰写,旨在帮助开发者提升C#编程效率,更好地理解和利用语言特性。中文版的...
在C#编程中,泛型列表`List<T>`是一个非常重要的数据结构,它为我们提供了动态数组的功能,并且具有类型安全的特性。这篇文章将深入探讨`List<T>`的使用,包括其基本操作、性能特点以及一些高级用法。 一、基础概念...
C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。泛型提高了代码的效率、安全性和灵活性,避免了不必要的类型转换,并提供了更强的类型检查。在C#中,泛型...
很好用的C#读写缓存泛型公共类,C#获取 创建 修改缓存泛型公共方法
本文将深入探讨如何在C#中使用泛型和数组排序,并结合面向对象原则,尤其是ASP.NET和.NET框架中的相关概念。 首先,我们需要理解什么是泛型。在C#中,泛型允许我们定义类型参数化的类、接口和方法。这意味着在编写...
《More Effective C#中文版 改善C#程序的50个具体办法》是一本针对C#编程语言的进阶指南,由业界资深专家撰写,旨在帮助开发者提升代码质量和效率。书中通过50个具体的实践建议,深入浅出地探讨了如何在C#开发过程中...
在C#编程中,泛型集合是一个非常重要的概念,它为开发者提供了强大的工具来处理不同类型的数据,同时保持代码的灵活性和效率。泛型是.NET框架引入的一种特性,它允许我们创建可重用的类型安全的代码,适用于多种数据...
在C#编程中,WinForms应用程序常常需要与用户交互,展示和操作数据。在这个场景下,`DataGridView`控件是一个非常实用的工具,它能够方便地显示和编辑表格形式的数据。而`List<T>`作为.NET Framework提供的泛型集合...
本书延续了Effective系列图书的风格,针对 C# 2.0和 C# 3.0中添加的新特性给出了实用的建议。书中的 50个条目自成一体且又丝丝相扣,这些条目按照泛型、多线程开发、C#设计模式、C# 3.0语言增强、LINQ以及杂项等主题...
C#泛型 C#泛型是一种强类型机制,允许在编译时指定类型参数,从而提高代码的灵活性和可重用性。泛型可以应用于类、结构、接口和委托等多种类型。 1. 泛型类声明 泛型类声明是一个需要提供类型参数以形成实际类型...
泛型是C# 2.0中引入的一个重要特性,它极大地增强了代码的复用性和类型安全性,同时提升了性能。泛型允许我们在定义类、接口和方法时使用一个或多个类型参数,这些参数会在实际使用时被具体的类型替换。通过泛型,...
下面我们将详细探讨如何在C#中使用泛型实现枚举功能,以及非泛型实现的替代方法。 首先,让我们理解什么是泛型。在C#中,泛型允许我们创建可重用的数据结构和方法,这些结构和方法可以操作任何数据类型。这大大提高...