Aveva Marine VBNET 编程系列-封装一个类

aveva,marine,vbnet,编程,系列,封装,一个 · 浏览次数 : 11

小编点评

MarDrafting类实现了IDisposable接口,并通过遍历其属性,释放托管和未托管的资源。 **托管资源:** *托管对象:通过 `object.Dispose()` 方法释放。 *托管状态:通过 `disposedValue` 记录释放状态,并将其设置为 `true`时释放。 **未托管资源:** *未托管对象:通过循环使用 `obj.Dispose()` 方法释放。 *大型字段:如果这些字段可能很大,可以设置为 `null`。 *终结器:最终清理过程在 `Dispose(disposing As Boolean)` 方法中实现。 **注意:** * `Dispose(disposing As Boolean)` 方法只会在 `false` 的情况下执行。 * `GC.SuppressFinalize()` 方法阻止垃圾回收,直到 `Dispose(disposing As Boolean)` 方法结束。

正文

由于AM的marapi的大部分类实现了IDisposable接口,所有避免内存过大,用了一般需要dispose下

微软官方的解释:

https://learn.microsoft.com/zh-cn/dotnet/api/system.idisposable?view=net-7.0

 

以下是MarDrafting类的定义,很显然它实现了IDisposable接口

 

Imports System.Reflection

Imports Aveva.Marine.Drafting
Imports Aveva.Marine.UI ' marAPI.dll
Imports Aveva.Marine.Utility ' marAPI.dll
Public Class AmEnvironment
    Implements IDisposable

    Private disposedValue As Boolean
    Public Property DraftApp As New MarDrafting
    Public Property MarUI As New MarUi
    Public Property MarUtility As New MarUtil
    Sub New()

    End Sub
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not disposedValue Then
            If disposing Then

                Dim t As Type = Me.GetType()
                Dim pros = t.GetProperties().Where(Function(p) p.PropertyType.Namespace IsNot Nothing And p.PropertyType.Namespace.StartsWith("Aveva.Marine."))
                For Each pi As PropertyInfo In pros
                    Dim tp = pi.PropertyType
                    Dim obj As IDisposable = pi.GetValue(Me, Nothing)
                    obj.Dispose()
                Next
                ' TODO: 释放托管状态(托管对象)
            End If

            ' TODO: 释放未托管的资源(未托管的对象)并重写终结器
            ' TODO: 将大型字段设置为 null
            disposedValue = True
        End If
    End Sub

    ' ' TODO: 仅当“Dispose(disposing As Boolean)”拥有用于释放未托管资源的代码时才替代终结器
    ' Protected Overrides Sub Finalize()
    '     ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中
    '     Dispose(disposing:=False)
    '     MyBase.Finalize()
    ' End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中
        Dispose(disposing:=True)
        GC.SuppressFinalize(Me)
    End Sub
End Class

使用方法

 

与Aveva Marine VBNET 编程系列-封装一个类相似的内容: