تخلص من الكائنات في Visual Basic

click fraud protection

في مقال ترميز المثيلات الجديدة للكائنات ، كتبت عن الطرق المختلفة لذلك جديد يمكن إنشاء مثيلات الكائنات. المشكلة المعاكسة ، التخلص من شيء ما ، لن تقلق كثيرًا في VB.NET. يتضمن .NET تقنية تسمى جامع القمامة (GC) التي تهتم عادةً بكل شيء وراء الكواليس بصمت وفعالية. ولكن في بعض الأحيان ، عادةً عند استخدام تدفقات الملفات أو كائنات sql أو كائنات الرسومات (GDI +) (أي ، موارد غير مُدارة) ، قد تحتاج إلى التحكم في التخلص من الكائنات في التعليمات البرمجية الخاصة بك.

أولاً ، بعض الخلفية

فقط مثل يخدعمنشئ (ال جديد الكلمة الرئيسية) يخلق جديد موضوع، أ ديمُنشئ هي طريقة يتم استدعاؤها عند إتلاف كائن. ولكن هناك صيد. أدرك الأشخاص الذين أنشأوا .NET أنها كانت عبارة عن صيغة للأخطاء إذا كان يمكن لقطعتين مختلفتين من التعليمات البرمجية تدمير كائن ما. لذا فإن .NET GC هو المسيطر بالفعل وهو عادة الرمز الوحيد الذي يمكن أن يدمر مثيل الكائن. يقوم GC بتدمير كائن ما عندما يقرر ذلك وليس قبله. عادة ، بعد أن يترك الجسم النطاق ، يكون كذلك صدر حسب وقت تشغيل اللغة العامة (CLR). GC يدمر كائنات عندما يحتاج CLR إلى المزيد من الذاكرة الحرة. لذا فإن الخلاصة هي أنه لا يمكنك التنبؤ بموعد GC الذي سيدمر الكائن بالفعل.

instagram viewer

(ويلل... هذا صحيح تقريبا كل الوقت. تستطيع الاتصال GC والقوة أ دورة جمع القمامة، لكن السلطات تقول عالميًا إنها سيئة فكرة وغير ضرورية على الإطلاق.)

على سبيل المثال ، إذا قام كودك بإنشاء ملف الزبون الكائن ، قد يبدو أن هذا الرمز سوف يدمره مرة أخرى.

الزبون = لا شيء

لكنها لا تفعل ذلك. (تعيين كائن على لا شيء يسمى عادة ، تبطل الكائن.) في الواقع ، هذا يعني فقط أن المتغير لم يعد مرتبطًا بكائن بعد الآن. في وقت لاحق ، سيلاحظ GC أن الكائن متاح للتدمير.

بالمناسبة ، بالنسبة للكائنات المدارة ، لا شيء من هذا ضروري حقًا. على الرغم من أن كائنًا مثل زر سيقدم طريقة التخلص ، إلا أنه ليس من الضروري استخدامه وقلة من الناس يفعلون ذلك. تتم إضافة مكونات Windows Forms ، على سبيل المثال ، إلى كائن حاوية يسمى المكونات. عند إغلاق نموذج ، يتم استدعاء طريقة التخلص منه تلقائيًا. عادة ، ما عليك سوى القلق بشأن أي من هذا عند استخدام كائنات غير مُدارة ، وحتى ذلك الحين فقط لتحسين برنامجك.

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

الزبون. تخلص() الزبون = لا شيء

نظرًا لأن GC سوف يدمر كائنًا معزولًا ، سواء قمت بتعيين متغير الكائن إلى لا شيء ، فهذا ليس ضروريًا حقًا.

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

في سلسلة GDI + ، باستخدام يتم استخدام الكتلة بشكل متكرر جدًا لإدارة تلك الكائنات الرسومية المزعجة. فمثلا ...

باستخدام myBrush باسم LinearGradientBrush _. = جديد LinearGradientBrush (_. أنا. مستطيل العميل ، _. اللون. اللون الأزرق. أحمر _. LinearGradientMode. عرضي) <... ...> استخدام نهاية

myBrush يتم التخلص منها تلقائيًا عند تنفيذ نهاية الكتلة.

نهج GC لإدارة الذاكرة هو تغيير كبير عن الطريقة التي فعلها VB6. تم تدمير كائنات COM (المستخدمة من قبل VB6) عندما وصل عداد داخلي للمراجع إلى الصفر. لكن كان من السهل جدًا ارتكاب خطأ حتى يكون العداد الداخلي مغلقًا. (نظرًا لأن الذاكرة كانت مقيدة وغير متاحة للكائنات الأخرى عند حدوث ذلك ، كان هذا يسمى "تسرب الذاكرة".) بدلاً من ذلك ، يتحقق GC بالفعل لمعرفة ما إذا كان أي شيء يشير إلى شيء ويدمره عندما لا يكون هناك المزيد المراجع. نهج GC لديه تاريخ جيد في لغات مثل Java وهو أحد التحسينات الكبيرة في .NET.

في الصفحة التالية ، ننظر في واجهة IDisposable... الواجهة التي تريد استخدامها عندما تحتاج إلى التخلص من الكائنات غير المُدارة في التعليمات البرمجية الخاصة بك.

إذا قمت بتشفير كائن خاص بك يستخدم موارد غير مُدارة ، يجب عليك استخدام سهل المنال واجهة الكائن. تسهّل Microsoft هذا الأمر من خلال تضمين مقتطف شفرة ينشئ النمط المناسب لك.


انقر هنا لعرض الرسم التوضيحي
انقر فوق الزر "السابق" في المستعرض الخاص بك للعودة

يبدو الرمز الذي تمت إضافته كما يلي (VB.NET 2008):

 فئة ResourceClass. يطبق غير قابل للتنفيذ. 'للكشف عن المكالمات الزائدة. تم التخلص من الخاص على أنه منطقي = خطأ. 'IDisposable. التصرف الفرعي المحمي القابل للتجاوز (_. التخلص عن طريق Boolean) إن لم يكن Me.disposed ثم. إذا التخلص ثم. 'دولة أخرى مجانية (كائنات مدارة). إنهاء إذا. حرر دولتك (كائنات غير مُدارة). قم بتعيين الحقول الكبيرة على قيمة خالية. إنهاء إذا. Me.disposed = صحيح. نهاية فرعية. #Region "دعم IDisposable" تمت إضافة هذا الرمز بواسطة Visual Basic إلى. 'تنفيذ النمط القابل للتصرف بشكل صحيح. تخلص عام من الأغراض الفرعية () يطبق أدوات غير متاحة. تخلص. "لا تغير هذا الرمز. 'أدخل كود التنظيف. قم بالتخلص (ByVal التخلص من البوليانية) أعلاه. تخلص من (True) GC.SuppressFinalize (Me) End Sub. تجاوزات محميّة Sub Subise () '' لا تقم بتغيير هذا الرمز. 'أدخل كود التنظيف. قم بالتخلص (ByVal التخلص من البوليانية) أعلاه. تخلص من (خطأ) MyBase. إنهاء () End Sub. # نهاية المنطقة. نهاية الفصل الدراسي 

تخلص هو تقريبًا نمط تصميم مطور "مفروض" في .NET. هناك حقًا طريقة واحدة صحيحة للقيام بذلك وهذه هي. قد تعتقد أن هذا الرمز يفعل شيئًا سحريًا. لا.

لاحظ أولا أن العلم الداخلي استبعاده ببساطة دوائر قصيرة كل شيء حتى تتمكن من الاتصال تخلص (التخلص) كما تشاء.

الرمز ...

 GC.SuppressFinalize (أنا) 

... يجعل الشفرة الخاصة بك أكثر كفاءة من خلال إخبار GC أن الكائن قد تم التخلص منه بالفعل (عملية "مكلفة" من حيث دورات التنفيذ). إنهاء محمي لأن GC يستدعيه تلقائيًا عند إتلاف كائن. يجب عليك عدم استدعاء إنهاء. المنطقي التخلص يخبر الكود ما إذا كان الكود الخاص بك قد بدأ التخلص من الكائن (صحيح) أو ما إذا كان GC قد فعل ذلك (كجزء من وضع اللمسات الأخيرة الفرعية. لاحظ أن الرمز الوحيد الذي يستخدم القيمة المنطقية التخلص يكون:

 إذا التخلص ثم. 'دولة أخرى مجانية (كائنات مدارة). إنهاء إذا 

عند التخلص من كائن ، يجب التخلص من جميع موارده. عندما CLR جامع القمامة التخلص من كائن يجب التخلص من الموارد غير المُدارة فقط لأن جامع القمامة يعتني تلقائيًا بالموارد المُدارة.

الفكرة وراء مقتطف الرمز هذا هي أنك تضيف رمزًا للعناية بالكائنات المُدارة وغير المُدارة في المواقع المُشار إليها.

عندما تستمد فئة من أ الطبقة الأساسية التي تطبق IDisposable ، لا يلزمك تجاوز أي من الأساليب الأساسية ما لم تستخدم موارد أخرى تحتاج أيضًا إلى التخلص منها. إذا حدث ذلك ، يجب أن تلغي الفئة المشتقة طريقة التخلص (التخلص) للفئة الأساسية للتخلص من موارد الفئة المشتقة. ولكن تذكر استدعاء طريقة التخلص (التخلص) من الفئة الأساسية.

التصرفات المحمية للتجاوزات الفرعية (التخلص عن طريق القيمة باعتبارها منطقية) إذا لم تكن قد تم تحديدها بعد ذلك. إذا التخلص ثم. 'أضف التعليمات البرمجية إلى الموارد المُدارة المجانية. إنهاء إذا. أضف رمزك إلى الموارد غير المُدارة المجانية. إنهاء إذا. MyBase. تخلص (التخلص) نهاية فرعية

يمكن أن يكون الموضوع ساحقًا قليلاً. الغرض من الشرح هنا هو "إزالة الغموض" عما يحدث بالفعل لأن معظم المعلومات التي يمكنك العثور عليها لا تخبرك!

instagram story viewer