泛型和数组列表我在这里做的系统是.net2.0之前写的,没有使用泛型。最终更新到了2.0,但是由于时间关系,没有重构任何代码。在许多地方,代码使用ArraysLists等将事物存储为对象。从性能角度来看,更改代码以使用泛型有多重要?我是从性能的角度来看它的,装箱和拆箱等等,效率很低,但是这实际上改变了多少性能增益?泛型是否在向前发展的基础上可用,或者是否有足够的性能变化以保证认真努力更新旧代码?从技术上讲,正如您所说,泛型的性能更好。但是,除非性能至关重要并且您已经在其他方面进行了优化,否则您可能会花时间在其他地方获得更好的改进。我会建议:当然除了性能之外还有其他原因改为泛型:这是我从一个100KB的文件中简单地解析一个字符串100,000次得到的结果。通用列表(char)在文件中完成100,000次需要612.293秒。ArrayList完成文件100,000次需要2,880.415秒。这意味着在这种情况下(因为你的里程会有所不同)通用列表(Ofchar)快4.7倍。这是我已经检查了100,000次的代码:.Text.StringBuilder()ForiAsInteger=0TogenList.Count-1dummy.Append(genList(i))NextEndSubPublicSubRun(ByValstrToProcessAsString)ImplementsIPerfStub.RunDimgenList作为新列表(OfChar)ForEachchAsCharInstrToProcess.ToCharArraygenList.Add(ch)NextDimdummyAsNewSystem.Text.StringBuilder()ForiAsInteger=0TogenList.Count-1dummy.Append(genList(i))下一步唯一可以确定的方法是使用dotTrace之类的工具来分析代码。http://www.jetbrains.com/profiler/装箱/拆箱在您的特定应用程序中可能微不足道,不值得重构。展望未来,由于编译时类型安全,您仍应考虑使用泛型。泛型,无论是Java还是.NET,都应该用于设计和类型安全,而不是性能。自动装箱与通用固定装置(基本上是隐式对象到基元的转换)不同,正如您所提到的,如果有很多算术或其他操作会因重复而导致性能损失,则不应使用它们代替基元.隐式对象创建/销毁。总的来说,我建议继续前进,只在需要清除类型安全/设计意图而不是性能时更新现有代码。这取决于,最好的答案是分析您的代码并查看。我喜欢AQTime,但存在许多软件包。通常,如果正在使用ArrayList,则可能值得切换到通用版本。事实上,您很可能甚至无法衡量性能差异。装箱和拆箱是额外的步骤,但现代计算机速度如此之快,几乎没有区别。由于ArrayList实际上只是一个带有漂亮包装器的普通数组,与转换为泛型相比,您可能会从更好的数据结构选择(ArrayList.Remove是O(n)!)中看到更好的性能。编辑:对Outlaw程序员来说有一点好处,你仍然会使用泛型进行装箱和拆箱,它只是隐含地发生。检查所有代码是否存在异常以及来自“is/as”关键字的空值会有所帮助。您会发现最大的收获是在维护阶段。泛型更容易处理和更新,而无需处理转换和转换。如果这是您经常访问的代码,那么一定要努力。如果这是几年没有碰过的代码,我真的不会打扰。自动装箱/拆箱与泛型有什么关系?这只是一个类型安全问题。对于非泛型集合,您需要显式转换回对象的实际类型。使用泛型,您可以跳过此步骤。我不认为有一种或另一种方式的性能差异。我的老公司其实也考虑过这个问题。我们采取的方法是:如果重构容易,就重构;如果不是(即它会触及太多类),请稍后再处理。这实际上取决于您是否有时间去做,或者您是否有更重要的项目要编码(即您应该为客户实现的功能)。然后,如果您不是在为客户做某事,请继续花一些时间进行重构。它将提高您自己的代码可读性。取决于您的代码中有多少。如果您在UI中绑定或显示大型列表,您可能会看到巨大的性能提升。如果您的ArrayList只是四处漂浮,清理它可能没什么大不了的,但它也不会对整体性能产生太大影响。如果您在整个代码中使用大量ArrayList,并且替换它们(可能会打乱您的日程安排)将是一个很大的缺点,那么您可以采用“触即改”的方法。但最主要的是泛型更易于阅读并且在整个应用程序中更稳定,因为您可以从它们那里获得强大的输入。您不仅获得了性能,还获得了代码的可维护性和稳定性。如果你能很快做到,我会说去做。如果您可以从产品所有者那里购买,我建议您将其清理干净。之后你会更喜欢你的代码。如果您的ArrayList中的实体是Object类型,您可以通过从不将它们转换为正确的类型来获得一点好处。如果它们是Value类型(struct或primitive,如Int32),那么装箱/拆箱过程会增加很多开销,而通用集合应该更快。这是关于泛型具有更好性能的主题的MSDN文章,特别是如果您将使用值类型(int、bool、struct等),您将获得显着的性能提升。使用具有值类型的Arraylist会导致装箱/拆箱,如果完成数百次,这实际上比使用通用列表慢。当将值类型存储为对象时,每个项目最多可以存储四个时间记忆。虽然这个数量不会耗尽您的RAM,但较小的缓存内存可能包含较少的项目,这意味着在迭代长集合时,会有很多从主内存到缓存的副本,这会降低您的应用程序的速度。我在这里写了它。使用泛型还意味着如果您想在以后的c#版本中利用linq之类的东西,您的代码将更简单、更易于使用。以上就是C#学习教程分享的全部内容:泛型和数组列表。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
