vb.net中的静态局部变量是否不适合一次性对象?

时间:2015-09-04 10:19:35

标签: vb.net dispose local-variables

对于一次性物品,本地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)中)?

2 个答案:

答案 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;在搜索框中,您将看到所有这些字体都留在内存中。