我最近访问了一个非常古老的C#代码库(非常旧的意思是.NET 1.1和C#1.2),以便找到可以改进的地方。当弓是最强大的武器时,它就像是过去的窗口。我以前从来没有机会在C#版本中自愿编写比C#2更小的代码。
基本上,我发现有一大堆ArrayList
用于存储数字和结构。从大到大,我的意思是数十或数十万的价值观。像
ArrayList numbers = new ArrayList();
for(int i = 0; i < BIG_CONSTANT; i++)
numbers.Add(someNumberReturnedFromMethod);
这些列表在某个地方排序,然后再按另一个地方的不同标准排序,或者对它们进行搜索。
知道ArrayList
与对象一起工作会导致我提出的两个问题
所以问题是,如何在没有仿制药的帮助下解决这个问题?我肯定不会从这些结构中创建类来删除un / boxing,因为有这么多数据,这确实有所不同(测试)。
我考虑过创建可以使用我的结构的自定义数组列表。我是否必须为每个结构创建一个自定义数组列表实现?关于它,它意味着为每个结构定义我自己的IEnumerable,ICollection和IList,对吗?
我认为为了获得更高性能和类型安全的系统付费可能是一个很好的成本,但在尝试之前我想知道你的意见。
答案 0 :(得分:3)
如果没有泛型,则无法创建避免使用值类型进行装箱的集合。但是您可以为具体的值类型创建专门的集合。
以下是一个想法:创建您自己的ArrayList
版本,但使用 T4模板为您关注的每种具体类型生成专用版本。这使您无需代码重复即可ArrayListInt32
,ArrayListSingle
等等。
这可以消除拳击和恢复类型安全性方面的任何性能损失。
实际上,Java有类似的问题,因为由于类型擦除,他们不能使用泛型来避免装箱。它们在较新版本中确实有一些专门的数组列表类。感谢上帝C#确实在最近的版本中实现了真正的泛型。