VB.Net/Data Structure/IDisposable

Материал из VB Эксперт
Перейти к: навигация, поиск

Dispose - called when we need disposing

Imports System
Imports System.Drawing
Imports System.Data
Imports System.IO
Imports System.Collections
Imports System.Windows.Forms
Imports System.Drawing.Printing
Public Class MainClass
    Shared Sub Main()
        Dim file As New MyFile("c:\FinalizeDemo.txt")
        file.AddText("Hello, world!")
        " now, clear the reference to the object...
        file.Dispose()
        file = Nothing
        " wait for the user to press return...
        Console.WriteLine("Press Return to collect the garbage...")
        " force a collect...
        GC.Collect()
        " wait for the user to quit...
        Console.WriteLine("Press Return to quit...")
    End Sub
End Class

Public Class MyFile
    Implements IDisposable
    Private stream As FileStream
    Private isDisposed As Boolean

    Public Sub New(ByVal filename As String)
        stream = New FileStream("test.txt", FileMode.OpenOrCreate)
        Console.WriteLine("Object " & GetHashCode() & " created.")
        Console.WriteLine("Using file: " & filename)
    End Sub
    Public Sub AddText(ByVal buf As String)
        If isDisposed = True Then
            Throw New ObjectDisposedException("I"ve been disposed!")
        End If
        Dim writer As New StreamWriter(stream)
        writer.WriteLine(Date.Now)
        writer.WriteLine(buf)
        writer.Close()
    End Sub

    Public Sub Dispose() Implements System.IDisposable.Dispose
        If isDisposed = True Then Return
        
        stream.Close()
        stream = Nothing
        isDisposed = True
        GC.SuppressFinalize(Me)
        Console.WriteLine("Object " & GetHashCode() & " disposed.")
    End Sub
    Protected Overrides Sub Finalize()
        Dispose()
        Console.WriteLine("Object " & GetHashCode() & " finalized.")
    End Sub
End Class


Use IDisposable

Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.ruponentModel
Imports System.Windows.Forms
Imports System.IO
Imports System.Xml.Serialization
Public Class MainClass
    
    Shared Sub Main(ByVal args As String())
        Dim i As Integer = 0
        i += 1
        Dim obj As New Named("Dispose " & i)
        obj.Dispose()
    End Sub
End Class
    Public Class Named
        Implements IDisposable
        Public Name As String
        Public Sub New(ByVal new_name As String)
            Name = new_name
        End Sub
        " Free resources.
        Protected Overrides Sub Finalize()
            Dispose()
        End Sub
        " Display our name.
        Public Sub Dispose() Implements System.IDisposable.Dispose
            Static done_before As Boolean = False
            If done_before Then Exit Sub
            done_before = True
            Console.WriteLine(Name)
        End Sub
    End Class