对于一次性物品,本地Static
变量是否是禁区?这种情况的主要问题是:Dispose()
可能永远不会被调用。
示例:
Sub DrawText(text As String, fontFamily As Font)
Static cachedFont As Font = Nothing
If cachedFont Is Nothing OrElse fontFamily <> cachedFont.Family Then
cachedFont = New Font(fontFamily)
EndIf
'now draw text using cachedFont
End Sub
是否是这种情况,是将本地静态变量转换为本地类变量的唯一方法(它被置于Sub Dispose(disposing As Boolean)
中)?
答案 0 :(得分:2)
是的,如果你想让它们被处理,它们是不可取的。
Static
局部变量被编译为
Shared
程序中:
Shared
字段变量Shared
实例方法中:
...哪个名称来自方法名称和变量名称,以确保每种类型的唯一名称。
Shared
变量永远不会在应用程序的生命周期中处理,因为您只能处置实例。当您致电instance.Dispose
或使用Using
- 声明时,会处理实例变量。
但是CLR中的垃圾收集器没有(也不能)处理非托管对象。所以问题是你不能从Dispose
处置这些对象,因为它超出范围作为局部变量。因此,如果您需要清除Dispose
中的非托管资源,则无法使用Static
局部变量执行此操作,因为您无法访问它们。
值得一读:
答案 1 :(得分:1)
不幸的是它与VS2015&#39检查之后; S Memory Usage Tool我可以证实,静态实例是不会强> GC&#39;编闭时/设置例如一个形式使用他们。
要测试它,请创建一个包含两个表单的项目。在Form2的Form2_Load
事件中声明并向静态List(Of Font)
添加一些字体。在Form1_Load
中创建并显示Form2的实例
使用Debug->Performance and Diagnostics
菜单选项执行项目,使用Memory Usage
行为
你会弹出两种形式
关闭Form2。点击Force GC
窗口中的Memory Usage Tool
按钮,然后拍摄内存快照
关闭Form1以停止执行。
点击快照1中的nnnn objects
链接,将会打开一个新窗口。取消选中该窗口右上角下拉按钮中的Collapse small objects
输入&#39; font&#39;在搜索框中,您将看到所有这些字体都留在内存中。