C# 在早期版本的.NET中执行和类型安全的值类型集合

C# 在早期版本的.NET中执行和类型安全的值类型集合,c#,performance,.net-1.1,value-type,c#-1.2,C#,Performance,.net 1.1,Value Type,C# 1.2,我最近访问了一个非常古老的C#代码库(非常古老的意思是.NET1.1和C#1.2),以便找到可以改进的地方。它就像一扇通向过去的窗户,那时弓是最有力的武器。我以前从来没有机会自愿用比C#2小的C#版本编写代码 基本上,我发现有一大堆大型的ArrayLists用于存储数字和结构。总的来说,我指的是数万或数十万的价值观。差不多 ArrayList numbers = new ArrayList(); for(int i = 0; i < BIG_CONSTANT; i++) numbe

我最近访问了一个非常古老的C#代码库(非常古老的意思是.NET1.1和C#1.2),以便找到可以改进的地方。它就像一扇通向过去的窗户,那时弓是最有力的武器。我以前从来没有机会自愿用比C#2小的C#版本编写代码

基本上,我发现有一大堆大型的
ArrayList
s用于存储数字和结构。总的来说,我指的是数万或数十万的价值观。差不多

ArrayList numbers = new ArrayList();
for(int i = 0; i < BIG_CONSTANT; i++)
    numbers.Add(someNumberReturnedFromMethod);
ArrayList number=new ArrayList();
对于(int i=0;i
这些列表在某个位置排序,然后在另一个位置按不同的标准再次排序,或者对它们执行搜索

知道
ArrayList
与对象一起工作会导致我遇到两个问题

  • 无类型安全
  • 到处都是装箱和拆箱
所以问题是,如何在没有泛型帮助的情况下解决这个问题?我绝对不会为了删除un/boxing而从这些结构中创建类,因为有这么多数据,这真的会产生不同(测试)

我想创建一个自定义数组列表来代替我的结构。我是否必须为每个结构创建自定义数组列表实现?仔细想想,这意味着为每个结构定义我自己的IEnumerable、ICollection和IList,对吗


我认为,为了获得更高性能和类型安全的系统,这可能是一个很好的成本,但在尝试之前,我想知道您的意见。

没有泛型,您无法创建一个避免使用值类型装箱的集合。但是您可以为具体的值类型创建专门的集合

这里有一个想法:创建您自己的
ArrayList版本
,但使用T4模板为您关心的每种具体类型生成专门的版本。这将为您提供一个
arraylisting32
、一个
ArrayListSingle
等,而无需代码重复

这将从装箱中移除任何性能损失,并恢复类型安全


实际上,Java也有类似的问题,因为由于类型擦除,它们无法使用泛型来避免装箱。在较新的版本中,它们确实有一些专门的数组列表类。谢天谢地,C#在最近的版本中实现了真正的泛型。

你对.net 1.1印象深刻吗?当您计划改进项目时,为什么不使用AtleSet.net2.0?如果您实际的问题是“为了提高性能,我可以用什么替换我的
ArrayList
s”,那么答案恐怕是“基准测试它”。你显然知道这些备选方案,但它们是否有意义可能完全取决于它们在该项目中的使用方式。@SriramSakthivel我希望能这么简单。这不像我要对客户说的那样——“嘿,我会在你的服务器上安装.NET2.0,看看它是否工作得更好,如果不是……”。他们不想在这里这样做。我有一个选择,是的,但我想先在这里咨询一下。基准测试是肯定的事情。我还认为这对很多人来说可能是一个有趣的问题。数组不会导致拳击,它们可以被排序。因此,您的示例可以如下所示:
NumberStruct[]numbers=newnumberstruct[BIG_常量];对于(int i=0;i。很明显,问题是数组的大小是固定的,但我认为如果你不能访问(真正的)泛型类型,比如
List
,你会更多地使用数组。我使用T4模板构建电子邮件正文,但我从来没有想过要使用它。说得不错!