ali.alfoly كتب :[b]جزاك الله خيرا وجعله فى موازين حسناتك
طيب ارجو توضيح بعض النقاط مش فاهمها
1 - ماهذا الامر او هذه الدالة
كود :
[color=#0000FF]MyBase[/color][color=#000000].Finalize()[/color]
ولماذا تم وضعها فى Try
كود :
[color=#0000FF]Protected[/color] [color=#0000FF]Overrides[/color] [color=#0000FF]Sub[/color][color=#000000] Finalize()[/color]
[color=#0000FF]Try[/color]
[color=#000000] counter -= 1[/color]
[color=#0000FF]Finally[/color]
[color=#0000FF]MyBase[/color][color=#000000].Finalize()[/color]
[color=#0000FF]End[/color] [color=#0000FF]Try[/color]
[color=#0000FF]End[/color] [color=#0000FF]Sub[/color]
2 - ما هذا الـ Try السابق الـ Try الذى اعرفه يكون بهذا الشكل
كود :
[color=#0000FF]Try[/color]
[color=#0000FF]Catch[/color][color=#000000] ex [/color][color=#0000FF]As[/color] [color=#2B91AF]Exception[/color]
[color=#0000FF]End[/color] [color=#0000FF]Try[/color]
3 - انا اعرف ان عمر المتغير ينتهى بانتهاء الاجراء الذى هو بداخله
فى الكود السابق لحدرتك فى المشاركة #4 انا قمت بالاعلان عن المتغير داخل Sub الخاص بـ Button3
كود :
[color=#0000FF]Private[/color] [color=#0000FF]Sub[/color][color=#000000] Button3_Click(sender [/color][color=#0000FF]As[/color] [color=#0000FF]Object[/color][color=#000000], e [/color][color=#0000FF]As[/color] [color=#2B91AF]EventArgs[/color][color=#000000]) [/color][color=#0000FF]Handles[/color][color=#000000] Button3.Click[/color]
[color=#0000FF]Dim[/color][color=#000000] a [/color][color=#0000FF]As[/color] [color=#0000FF]New[/color] [color=#2B91AF]AAA[/color]
[color=#0000FF]End[/color] [color=#0000FF]Sub[/color]
لماذا لم ينتهى بانتهاء الـ Sub بل انتهى بانتهاء الـ Class
انا اهنيك على إنشائك للموضوع اخي
فلو انك تجاهلت الامور الي مافهمتها راح تندم مستقبلا - عن تجربة
أي شي مو فاهمنه ضع له موضوع هنا كي تستفيد منه ويستفيد الاخرون منه (ولكن هذا لايعني ان لاتبحث عن الحل اولا)
لدينا مثل بالهجة البحرانية يقول :
"اسئل واسئل حتى يقول الناس عنك أهبل" ههههه
المهم ماعلينا
إن شاء الله السطور القادمة توضح لك الي مافهمته
--
1- Finalize هي الدالة المعاكسة للمشيد (Constructed)
المشيد هي دالة يتم اطلاقها عندما تقوم بإنشاء نسخة فئة باستعمال new
لاحظ معي :
PHP كود :
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim cl As New AAA 'سيتم استدعاء المشيد لأننا قمنا بإنشاء كائن
End Sub
End Class
Public Class AAA
Public Sub New()
'دالة المشيد
'يتم استدعائها لحظة انشاء الكائن
End Sub
End Class
المثال السابق وضح لك المشيد
ولكن ماذا عن "المهدم" (Finalize) ؟
المهدم هي دالة يتم اطلاقها عندما يموت الكائن ولست انت من تحدد موعد موت الكائن بل هناك شيئ يدعى Garbage Collection
هي المسؤولة عن قتل الكائنات في الوقت المناسب
--
2[COLOR="#FF0000"]- try تستخدم
لقنص الاخطاء و
عدم توقف البرنامج عند حدوثها ، لاادري مالحالة التي تطلبت وضع try لإني لم أشاهد الكود كاملا
[/COLOR]
--
[COLOR="#FF0000"]
3- try - catch - finally هو التركيب الحقيقي لtry[/COLOR]
ولكن يمكن الاستغناء عن finally
والعكس صحيح ايضا (يمكن الاستغناء عن catch)
وتستعمل finally لتفيذ الكود الذي بداخلها
سواء حدث خطأ او لم يحدث
بعكس catch التي تقوم بتفيذ الاكواد التي بداخلها
إذا حصل خطا فقط
--
4- من الذي خدعك وقال لك ان الكائنات المرجعية تموت او (تنتهي حسب تعبيرك) بإنتهاء الإجراء (sub)
صحيح أنا لانكر ان الكائنات تموت بإنتهاء الاجراء ولكن هذا يحدث فقط للكائنات
(ذات القيمة)
[COLOR="#2F4F4F"]الانواع المرجعية (Reference type) هي :
1- الفئات (class)
2- المصفوفات
3- النوع string
4- المفوضات[/COLOR]
[COLOR="#0000CD"]الانواع ذات القيمة (Value type) :
1- جميع انواع الارقام (integer , double , flout ...)
2-النوع boolean و char وايضا date
3-التراكيب (structures)
4- التراكيب من نوع Enumerations (بشرط ان تكون البيانات داخل التركيب من نوع value type المذكورة فوق)[/COLOR]
الحديث عن الفروقات بينهم فيه كلام شوي طويل
ولكن إختصارا :
الvalue type هو نوع يخزن قيمته في المكدسة حيث ان الكائن
يشير الى قيمته مباشرة
PHP كود :
Dim a As Integer = 4 'تشير الى الرقم 4 a
اما الrefrance type هو نوع يخزن قيمته في مكان في الذاكرة يسمى Managed Heap حيث ان الكائن
يشير إلى عنوان القيمة في الManaged heap
ضع الف خط تحت
يشير إلى عنوان القيمة
شوف هذا المثال :
PHP كود :
Dim a As New AAA 'في الذاكرة AAA يشير إلى عنوان بيانات الفئة a
-
نرجع لموضوعنا
فالانواع ذات القيمة (value type) تموت بنهاية الاجراء
PHP كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim num As Integer
End Sub 'سيموت المتغير num
خلاص المتغير num سينهي الى الابد وسيذهب إلى الجحيم
بينما الانواع المرجعية لايتم حذفها بإنتهاء الاجراء . إنما يتم حذف مؤشر الكائن الذي يشير إلى بيانات الفئة
PHP كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim xax As New AAA
End Sub 'Managed heapولكن ستبقى بيانات الكائن في ال xax سيحذف المؤشر
فعند نهاية الاجراء سيتم حذف المؤشر xax ولكن ستبقى بيانات الفئة AAA في ال Managed heap !!!!
قبل انتهاء الاجراء :
بعد انتهاء الاجراء :
ولهذا ترا ان الفئة لم تنتهي بإنتهاء الاجراء (يتم حذف مؤشر بياناتها فقط) إنما يتم حذف بيانات الفئة بواسطة Garbage Collection
حيث انها فئة في الدوت نت تقوم آليا بإدارة الكائنات وقتلها (حذفها) في الوقت المناسب
--
كما قلنا ان بيانات الفئة لاتنحذف بإنتهاء الاجراء
بل تقوم Garbage collection بحذفها آليا في الوقت المناسب
ولكن إن أردنا حذف البيانات يدويا
يمكننا طلب الدالة collect من ال Garbage collection
فهي تقوم بحذف جميع بيانات الفئات (او بيانات من نوع مرجعي)
التي ليست لها مؤشر
PHP كود :
GC.Collect()
GC.WaitForPendingFinalizers()
ملاحظة : GC يشير الى Garbage collection
--
--
--
اي استفسار اخر انا حاضر
تحياتي
[/b]