是在堆栈还是堆栈上创建的VB.net中动态创建的控件?

时间:2017-04-04 07:47:20

标签: vb.net memory optimization

我正在尝试使用目标跟踪应用程序来生成用户设置的目标列表。我目前只是使用标签作为占位符,以后我将使用它。我的问题是,当我用标签填充此表单时,它们是在堆还是堆栈上创建的?

每次加载表单时都会运行生成循环,因此我无法为自己推断。 (编辑:numberOfGoals是整个项目可以访问的单独模块文件中的全局变量。)如果在堆上创建对象,这是否意味着有更有效的方式来填充表单?也许保持一个以类似方式生成的全局目标列表,当加载这个表单时,只需从该列表加载到堆栈中?

如果这个问题看起来含糊不清,我道歉。我是VB.net和编程的新手。谢谢大家的时间。

Private Sub Tracker_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If numberOfGoals > 0 Then
        For counter As Integer = 0 To numberOfGoals Step 1
            Dim newLabel As New Label

            'Set control settings
            With newLabel
                .Name = "Label" & counter
                .Text = "Label " & counter + 1
                .Visible = True
                .Location = New Point(20, 10 + 25 * counter)
            End With

            'Activate form and add control
            Me.Activate()
            ActiveForm.Controls.Add(newLabel)
        Next
    ElseIf numberOfGoals = 0 Then
        Dim newLabel As New Label
        With newLabel
            .Text = "You have no goals set yet."
            .Location = New Point(20, 35)
            .AutoSize = True
        End With

        Me.Activate()
        ActiveForm.Controls.Add(newLabel)
    End If
End Sub

1 个答案:

答案 0 :(得分:3)

正在堆上创建这些标签。 .NET Framework中的内存管理和优化概念实际上非常吸引人;我在下面添加了一个链接。基本上,.NET Framework中的对象往往非常昂贵。至少,我会包括某种类型的用户检查,以防止创建太多目标。这显然也有实际的好处,因为成功的机会倾向于增加与焦点的比例(:。

关于你问题的第二部分,我猜你是指存储对每个动态创建的控件的引用,并在清理过程中删除每个控件。根据应用程序运行的时间长短,这可能不是一个坏主意。这实际上就是如何构建内存管理的早期实现。

基本上,创建了两个链接列表。第一个链表包括所有动态创建的对象。通过分析可以通过活动指针访问哪些对象来填充第二个列表。如果它们可以访问,则会将它们添加到列表中。如果无法访问,这意味着它们不再被使用(或者它们无法使用,因为无法访问它们)。将第二个列表与第一个列表进行比较,然后在第一个列表上但不在第二个列表上的任何对象然后“垃圾收集”。所以从本质上讲,你已经达到了垃圾收集的原始实现,恭喜!

这是一篇关于.NET Framework内存系统的精彩文章,特别是源于项目创建的无意中听到:(https://www.simple-talk.com/dotnet/net-framework/object-overhead-the-hidden-net-memory-allocation-cost/