3

我看到很多关于如何处理课程的“教程”,但我无法理解,而且所有这些都是在 c# 中而不是在 vb.net 中解释的不知道为什么

所以我的问题是:如何在此类中实现 IDisposable

    Public Class Container

    Private _sItemName As String
    Private _sPrice As Single
    Private _sPriceTot As Single
    Private _iNumber As Integer

    Sub New(ByVal _sItemName As String, ByVal _sPrice As Single, ByVal _sPriceTot As Single, ByVal _iNumber As Integer)
        Me._sItemName = _sItemName
        Me._sPrice = _sPrice
        Me._iNumber = _iNumber
        Me._sPriceTot = _sPriceTot
    End Sub

    Public Property sItemName() As String
        Get
            Return _sItemName
        End Get
        Private Set(value As String)
            _sItemName = value
        End Set
    End Property

    Public Property sPriceTot() As Single
        Get
            Return _sPriceTot
        End Get
        Private Set(value As Single)
            _sPriceTot = value
        End Set
    End Property

    Public Property sPrice() As Single
        Get
            Return _sPrice
        End Get
        Private Set(value As Single)
            _sPrice = value
        End Set
    End Property

    Public Property iNumber() As String
        Get
            Return _iNumber
        End Get
        Private Set(value As String)
            _iNumber = value
        End Set
    End Property
End Class

在有人问我想要做的是与 C++ 中的 .delete 做同样的事情之前

4

2 回答 2

9

通过添加以下内容指定您的类实现 IDisposable:

Public Class Container : Implements IDisposable

按 Enter 键会自动为您添加 Dispose 方法:

#Region "IDisposable Support"
        Private disposedValue As Boolean ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: dispose managed state (managed objects).
                End If

                ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub

        ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
        'Protected Overrides Sub Finalize()
        '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        '    Dispose(False)
        '    MyBase.Finalize()
        'End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

然后只需在 TODO 部分添加适当的代码

于 2013-09-30T15:10:19.867 回答
3

通常,IDisposable如果该类的实例将(或可能)知道应该在宇宙生命周期内的某个时间执行的某些操作,并且还知道它们可能是唯一具有知识和执行这些行动所必需的动力。调用Dispose是告诉这样一个类实例“如果你想确保完成某件事,这是你最后的机会”的一种方式。

这种模式最常见的用法是当一个类要求某个外部实体代表它做某事时,这会损害其他对象或实体,直到另行通知[例如,封装文件的类可能会要求底层操作系统独占访问一个文件,损害任何其他可能想要使用它的程序]。调用Dispose该类将导致它通知文件系统它不再需要该文件,因此它可能可供其他实体使用。

一般来说,如果一个实现的对象在IDisposable没有调用的情况下被放弃Dispose,一些应该完成的事情就不会完成。.NET 中有一种机制,如果系统注意到它们已被放弃,对象可以通过该机制请求通知,并且一些对象利用这种机制作为“后备”,以防它们在没有被正确处理的情况下被放弃。然而,这种机制有一些非常严重的限制。除非一个人对它在特定情况下的行为有特别详细的了解,否则永远不要依赖它。

于 2013-09-30T17:35:07.467 回答