我正在改进用VB.NET编写的应用程序。这是一个使用0.5GB(!)RAM的简单程序,因为有大量(30+)全局定义的数组,如:
Public Temp(1000000) As Double
Public ThisIsAnotherVariable(5000, 10) As String
Public ThisIsAVeryLargeArray(64, 50000) As Double
大多数情况下,这些大型“缓冲区”几乎没有使用,所以我想将它们转换为使用Collections.Generic中的东西。是否有任何半透明的方式来转换这些?或者让CLR只分配使用过的段的一些技巧?
答案 0 :(得分:1)
如果这些是“稀疏”数组,即几乎所有数组条目都是条目,最简单的解决方案可能是用字典替换它们:
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
。如果需要,则必须使用“默认值字典”而不是常规字典。不幸的是,BCL中没有内置这样的字典,但有others who have already looked at that problem and shared their implementation。如果要使用普通的.NET字典,则需要替换每个读取访问with a method call。