将对象分配给自己是一个好主意吗?

时间:2013-02-08 15:40:47

标签: asp.net vb.net garbage-collection

我有两个类,RecordSet和Record。 RecordSet有一个通用列表(记录)。

我可以通过调用RecordSet.AddRecord(ObjRecord)函数将对象添加到列表中,该函数返回RecordSet。当列表的计数为200时,会发生一些处理并返回一个新的RecordSet对象,否则返回自身,应用程序可以继续将Record对象添加到列表中。

我担心的是RecordSet会有200个对象,直到垃圾收集扫到它。这是个好主意吗?

Public Class RecordSet
  Private lstRecords As New List(Of Record)

  Public Function AddRecord(SomeVariable) AS RecordSet      
    lstRecords.Add(New Record())
    If lstRecords.Count = 200 Then
      Me.ProcessTheRecords()
      Return New RecordSet()
    Else
      Return Me
    End If
  End Function

  Private Sub ProcessTheRecords()
    'Do stuff in here
  End Sub

  Private Class Record
    Public Sub New()

    End Sub
  End Class
End Class

然后在我的申请中,我打电话给:

Dim objRecordSet AS New RecordSet
For Each VariableName In SomeList
  objRecordSet = objRecordSet.AddRecord(VariableName)
Next
'Process the remaining objects in objRecordSet here.

1 个答案:

答案 0 :(得分:0)

首先,这是一个非常糟糕的实践,很难跟踪新代码的代码并且是一个潜在的bug源。而不是每次都回归自己,改变你的设计。

将您的功能更改为:

Public Sub AddRecord(SomeVariable)
    lstRecords.Add(New Record()) <--- should't you be doing something with SomeVariable?!
    If lstRecords.Count = 200 Then
        Me.ProcessTheRecords()
    end if
End Function


Private Sub ProcessTheRecords()
   'Do stuff in here
   Me.lstRecords.clear()
End Sub

现在AddRecord完全按照它所说的做 - 它添加了一条新记录并修改了recordSet。 ProcessTheRecords按照预期的方式进行处理,如果你需要清除列表容器 - 哦,好吧,只需清除它。

我强烈推荐阅读这篇关于wiki的文章 Cohesion

就像提案一样,AddRecord可以是返回类型Boolean的函数,它表示操作成功(处理函数可能引发错误或异常?)。

现在它变得更干净了,不是吗?