تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
موضوع للنقاش- الواجهة IDisposable
#1
كاتب الموضوع : samerselo


- رجاء حار أريد أن يكون هذا الموضوع للنقاش العلمي حصريا يرجى عدم طرح مشاركات شكر أريد مشاركات نقاش حول هذا الموضوع فقط

- تحدثت سابقا عن هذه الواجهة في موضوعي إدارة المصادر والواجهة IDisposable وقد قمت بإضافة فقرة في نهايته تتضمن طريقة بسيطة لمعرفة الكود المدار Managed Code من الكود الغير مدار Unmanaged Code لذا أرجو قراءة الموضوع ثانية حتى لو قرأته سابقا اقرأ المشاركة التالية بشكل خاص إضافتي الجديدة البارحة للموضوع

- المصادر المدارة هي جميع المصادر التي تتم إدارتها من قبل بيئة زمن التشغيل أي أن بيئة زمن التشغيل تضمن تدميرها في وقت ما بعد الإنتهاء من استخدامها

- يمكننا القول أن المصادر الغير مدارة هي جميع المصادر التي لا تتم إدارتها من قبل بيئة زمن التشغيل مثل مقابض الملفات و أغراض Com و مقابس الشبكة أي أن بيئة زمن التشغيل لا تضمن تدميرها

وعملية التمييز بين الكود المدار والغير مدار هامة جدا عندما نقوم بكتابة تحقيقنا للواجهة IDisposable في فئتنا حتى نعرف كيف نكتب الوظيفة Dispose بشكل جيد

نحن عندما نضيف عند تعريف الفئة السطر التالي لإضافة تحقيق IDisposable لفئتنا يتم إضافة الإجراء المحمي Dispose الذي هو موضوعنا هنا

كود :
Implements IDisposable
ويكون هيكل الإجراء Dispose الذي يضاف آليا من قبل بيئة التطوير هو

كود :
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free other state (managed objects).
End If

' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
حيث نكتب كود تفريغ المصادر المدارة داخل حلقة If كما هو واضح من التعليقات ضمن الكود وكود المصادر الغير مدارة بعد حلقة If كما هو واضح أيضا من التعليقات ضمن الكود

ربما يرغب البعض بمناقشة هذا الموضوع بعيدا عن الدخول بموضوع المصادر المدارة والغير مدارة ولكن أثناء البحث مجددا في الموضوع وجدت أنه حتى نستطيع استخدام هذه الواجهة بالشكل الأمثل علينا فهم المصادر المدارة والغير مدارة بشكل جيد حتى نستطيع كتابة الإجراء بالشكل الأمثل

بعد هذه المقدمة سأطرح مثالين تاركا المجال للجميع للنقاش حول الموضوع كي نصل جميعا إلى الفهم الأمثل له
}}}
تم الشكر بواسطة:
#2
كاتب المشاركة : samerselo

المثال الأول

في مكتبة MSDN وجدت هذا المثال حول تحقيق الواجهة IDisposable

كود :
Public Class DisposableResource
Implements IDisposable

Private _resource As Stream

Private _disposed As Boolean

' The stream passed to the constructor
' must be readable and not null.
Public Sub New(ByVal stream As Stream)
MyBase.New()
If (stream Is Nothing) Then
Throw New ArgumentNullException("Stream is null.")
End If
If Not stream.CanRead Then
Throw New ArgumentException("Stream must be readable.")
End If
_resource = stream
Dim objTypeName As String = _resource.GetType.ToString
_disposed = False
End Sub

' Demonstrates using the resource.
' It must not be already disposed.
Public Sub DoSomethingWithResource()
If _disposed Then
Throw New ObjectDisposedException("Resource was disposed.")
End If

' Show the number of bytes.
Dim numBytes As Integer = CType(_resource.Length, Integer)
Console.WriteLine("Number of bytes: {0}", numBytes.ToString)
End Sub

Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)

' Use SupressFinalize in case a subclass
' of this type implements a finalizer.
GC.SuppressFinalize(Me)
End Sub

Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
If Not _disposed Then

' If you need thread safety, use a lock around these
' operations, as well as in your methods that use the resource.
If disposing Then
If (Not (_resource) Is Nothing) Then
_resource.Dispose()
End If
Console.WriteLine("Object disposed.")
End If

' Indicates that the instance has been disposed.
_resource = Nothing
_disposed = True
End If
End Sub
End Class
لاحظ أن stream هو مصادر مدارة ( راجع ما تحدثنا عنه سابقا ) لهذا قمنا باستدعاء الوظيفة Dispose الخاصة به ضمن الوظيفة Dispose في فئتنا داخل حلقة If ( مكان كود تحرير المصادر المدارة )
}}}
تم الشكر بواسطة:
#3
كاتب المشاركة : samerselo

المثال الثاني

هذا المثال الذي كنت أجرب عليه

كود :
Imports System.IO

Public Class ReturnTextFromaFile
Implements IDisposable

Private m_stream As Stream
Private m_RedText As String
Private m_FileName As String
Private buf() As Byte

Public Sub New(ByVal FName As String)
m_FileName = FName
End Sub

Public Function GetTextFromFile() As String
Try
m_stream = New FileStream(m_FileName, FileMode.Open)
ReDim buf(m_stream.Length)
m_stream.Read(buf, 0, m_stream.Length - 2)
m_stream.Close()

Dim enc As New System.Text.UnicodeEncoding
m_RedText = enc.GetString(buf)

Return m_RedText

Catch ex As Exception
MsgBox(ex.Message)
Finally
m_stream.Close()
End Try

Return "! - ERROR - !"

End Function

Private disposedValue As Boolean = False ' To detect redundant calls

' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' free other state (managed objects).
m_stream.Dispose()
End If
' free your own state (unmanaged objects).
' set large fields to null.
buf = Nothing
m_RedText = String.Empty
m_FileName = String.Empty
End If
Me.disposedValue = True
End Sub

#Region " IDisposable Support "
' 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(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region

End Class
هذا المثال أقوم فيه بقراءة كامل محتويات ملف نصي وأعيدها من خلال وظيفة تعيد قيمة من النوع String ومن أجل القيام بهذا العمل استخدمت مجموعة من المتغيرات في بداية تعريف الفئة حيث أن المتغير m_stream يمثل مصادر مدارة وباقي المتغيرات مثل المصادر الغير مدارة

كود :
Private m_stream As Stream
Private m_RedText As String
Private m_FileName As String
Private buf() As Byte
لايهمنا كثيرا في هذا الموضوع وظيفة الفئة هنا ولكن يهمنا هنا هو موضوع النقاش الإجراء المحمي Dispose حيث أن كوده في هذه الفئة هو

كود :
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' free other state (managed objects).
m_stream.Dispose()
End If
' free your own state (unmanaged objects).
' set large fields to null.
buf = Nothing
m_RedText = String.Empty
m_FileName = String.Empty
End If
Me.disposedValue = True
End Sub
لاحظ أين وضعت كود تحرير المصادر المدارة ( m_stream ) وكود تحرير المصادر الغير مدارة ( باقي المتغيرات ) في جسم الإجراء
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم