C# 在早期版本的.NET中执行和类型安全的值类型集合
我最近访问了一个非常古老的C#代码库(非常古老的意思是.NET1.1和C#1.2),以便找到可以改进的地方。它就像一扇通向过去的窗户,那时弓是最有力的武器。我以前从来没有机会自愿用比C#2小的C#版本编写代码 基本上,我发现有一大堆大型的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
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
与对象一起工作会导致我遇到两个问题
- 无类型安全
- 到处都是装箱和拆箱
我认为,为了获得更高性能和类型安全的系统,这可能是一个很好的成本,但在尝试之前,我想知道您的意见。没有泛型,您无法创建一个避免使用值类型装箱的集合。但是您可以为具体的值类型创建专门的集合 这里有一个想法:创建您自己的
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模板构建电子邮件正文,但我从来没有想过要使用它。说得不错!