我正在尝试使用目标跟踪应用程序来生成用户设置的目标列表。我目前只是使用标签作为占位符,以后我将使用它。我的问题是,当我用标签填充此表单时,它们是在堆还是堆栈上创建的?
每次加载表单时都会运行生成循环,因此我无法为自己推断。 (编辑: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
答案 0 :(得分:3)
正在堆上创建这些标签。 .NET Framework中的内存管理和优化概念实际上非常吸引人;我在下面添加了一个链接。基本上,.NET Framework中的对象往往非常昂贵。至少,我会包括某种类型的用户检查,以防止创建太多目标。这显然也有实际的好处,因为成功的机会倾向于增加与焦点的比例(:。
关于你问题的第二部分,我猜你是指存储对每个动态创建的控件的引用,并在清理过程中删除每个控件。根据应用程序运行的时间长短,这可能不是一个坏主意。这实际上就是如何构建内存管理的早期实现。
基本上,创建了两个链接列表。第一个链表包括所有动态创建的对象。通过分析可以通过活动指针访问哪些对象来填充第二个列表。如果它们可以访问,则会将它们添加到列表中。如果无法访问,这意味着它们不再被使用(或者它们无法使用,因为无法访问它们)。将第二个列表与第一个列表进行比较,然后在第一个列表上但不在第二个列表上的任何对象然后“垃圾收集”。所以从本质上讲,你已经达到了垃圾收集的原始实现,恭喜!
这是一篇关于.NET Framework内存系统的精彩文章,特别是源于项目创建的无意中听到:(https://www.simple-talk.com/dotnet/net-framework/object-overhead-the-hidden-net-memory-allocation-cost/)