VB.Net/Data Structure/IDisposable

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

Dispose - called when we need disposing

<source lang="vbnet"> 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

      </source>


Use IDisposable

<source lang="vbnet"> 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
          
      </source>