将大型全局静态分配数组转换为集合

Converting large global statically allocated arrays to Collections

我正在改造用 VB.NET 编写的应用程序。这是一个使用 0.5GB (!) RAM 的简单程序,因为有大量 (30+) 全局定义的数组,例如:

Public Temp(1000000) As Double
Public ThisIsAnotherVariable(5000, 10) As String 
Public ThisIsAVeryLargeArray(64, 50000) As Double

大多数时候,这些大 "buffers" 很少被使用,所以我想将它们转换为使用来自 Collections.Generic 的东西。有没有半透明的方式来转换这些?或者让 CLR 只分配使用的段的一些技巧?

如果这些是 "sparse" 个数组,即,如果几乎所有数组条目都是条目,最简单的解决方案可能是用字典替换它们:

Public Temp(1000000) As Double                     ' Old
Public Temp As New Dictionary(Of Int32, Double)()  ' New

分配将与源代码兼容:

Temp(10) = 2.0    ' Works for arrays and dictionaries

读取将与源代码兼容,如果值存在

Dim x = Temp(3)   ' Works for arrays and dictionary, if Temp(3) has been assigned

但是,访问未分配的值将产生 KeyNotFoundException。如果需要,则必须使用 "default value dictionary" 而不是常规词典。不幸的是,BCL 中没有内置这样的字典,但是有 others who have already looked at that problem and shared their implementation. If you want to use a plain .NET dictionary, you will need to replace every read access with a method call.