تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
توضيح دالة المهدمات
#1
السلام عليكم ورحمة الله وبركاته
كنت اقراء فى كتاب الاستاذ احمد جمال احتراف فيجوال بيسك 2008
وعندما وصلت الى المهدمات
كتب هذا الكود لاكن مش فاهمه

كود :
[color=#0000FF]Protected[/color] [color=#0000FF]Overrides[/color] [color=#0000FF]Sub[/color][color=#000000] Finalize()[/color]


    [color=#0000FF]End[/color] [color=#0000FF]Sub[/color]

فارجو من احد الاخوة الكرام ان يشرح لى هذه الجزئيه
وجزاكم الله خيرا
الرد }}}
تم الشكر بواسطة:
#2
[COLOR="#0000CD"]السلام عليكم ورحمة الله وبركاته
تستطيع ان تعتبرها كــ حدث يتم تقنيصه لحظة موت الفئة التي انشأتها
[/COLOR]
الرد }}}
تم الشكر بواسطة:
#3
طيب هذا الحدث لايتم تنفيذه عند هدم الاداة
وما السر فى هذا الاسم Finalize()
الرد }}}
تم الشكر بواسطة:
#4
اخي هو ما حدث كما قلت لك تستطيع ان تعتبره حدث
لحظه تعريف فئة جديده معينة يتم حفظ الفئة في الذاكرة في لحظة التعريف يتم عمل المشيد New الموجود في كل فئة وعند موت الفئة التي انشئتها (أي الانتهاء منها وتحريرها من الذاكرة) يتم عمل هذا الصب تستطيع التأكد

ضع كود

كود :
Public Class Form1
    Dim a As New aaa
End Class
Class AAA
    Protected Overrides Sub Finalize()
        MyBase.Finalize()
        MsgBox("تم هدم الفئة")
    End Sub
End Class

راح يتم ظهور المسج لحظه الاغلاق والسبب تحرير الذاكرة
الرد }}}
تم الشكر بواسطة:
#5
جزاك الله خيرا وجعله فى موازين حسناتك

طيب ارجو توضيح بعض النقاط مش فاهمها

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
الرد }}}
تم الشكر بواسطة:
#6
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.ObjectByVal e As System.EventArgsHandles 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 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.ObjectByVal e As System.EventArgsHandles MyBase.Load

        Dim num 
As Integer

    End Sub 
'سيموت المتغير num 

خلاص المتغير num سينهي الى الابد وسيذهب إلى الجحيم


بينما الانواع المرجعية لايتم حذفها بإنتهاء الاجراء . إنما يتم حذف مؤشر الكائن الذي يشير إلى بيانات الفئة

PHP كود :
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles 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]
الرد }}}
تم الشكر بواسطة:
#7
جزاك الله خير ريحتني من شرح طويل وانا شوي ضعيف في الشرح
الرد }}}
تم الشكر بواسطة:
#8
الشاكي لله كتب :

انا اهنيك على إنشائك للموضوع اخي

فلو انك تجاهلت الامور الي مافهمتها راح تندم مستقبلا - عن تجربة

أي شي مو فاهمنه ضع له موضوع هنا كي تستفيد منه ويستفيد الاخرون منه (ولكن هذا لايعني ان لاتبحث عن الحل اولا)

لدينا مثل بالهجة البحرانية يقول :

"اسئل واسئل حتى يقول الناس عنك أهبل" ههههه


المهم ماعلينا
إن شاء الله السطور القادمة توضح لك الي مافهمته



--



1- Finalize هي الدالة المعاكسة للمشيد (Constructed)
المشيد هي دالة يتم اطلاقها عندما تقوم بإنشاء نسخة فئة باستعمال new

لاحظ معي :

PHP كود :
Public Class Form1

    
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles 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- try تستخدم لقنص الاخطاء وعدم توقف البرنامج عند حدوثها ، لاادري مالحالة التي تطلبت وضع try لإني لم أشاهد الكود كاملا


--


3- try - catch - finally هو التركيب الحقيقي لtry

ولكن يمكن الاستغناء عن finally
والعكس صحيح ايضا (يمكن الاستغناء عن catch)

وتستعمل finally لتفيذ الكود الذي بداخلها سواء حدث خطأ او لم يحدث

بعكس catch التي تقوم بتفيذ الاكواد التي بداخلها إذا حصل خطا فقط


--


4- من الذي خدعك وقال لك ان الكائنات المرجعية تموت او (تنتهي حسب تعبيرك) بإنتهاء الإجراء (sub)

صحيح أنا لانكر ان الكائنات تموت بإنتهاء الاجراء ولكن هذا يحدث فقط للكائنات (ذات القيمة)

الانواع المرجعية (Reference type) هي :
1- الفئات (class)
2- المصفوفات
3- النوع string
4- المفوضات



الانواع ذات القيمة (Value type) :
1- جميع انواع الارقام (integer , double , flout ...)
2-النوع boolean و char وايضا date
3-التراكيب (structures)
4- التراكيب من نوع Enumerations (بشرط ان تكون البيانات داخل التركيب من نوع value type المذكورة فوق)


الحديث عن الفروقات بينهم فيه كلام شوي طويل

ولكن إختصارا :

الvalue type هو نوع يخزن قيمته في المكدسة حيث ان الكائن يشير الى قيمته مباشرة

PHP كود :
Dim a As Integer 'تشير الى الرقم 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.ObjectByVal e As System.EventArgsHandles MyBase.Load

        Dim num 
As Integer

    End Sub 
'سيموت المتغير num 

خلاص المتغير num سينهي الى الابد وسيذهب إلى الجحيم


بينما الانواع المرجعية لايتم حذفها بإنتهاء الاجراء . إنما يتم حذف مؤشر الكائن الذي يشير إلى بيانات الفئة

PHP كود :
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles 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



--
--
--



اي استفسار اخر انا حاضر

تحياتي





جزاك الله خيرا وجعله فى موازين حسناتك يوم تلقاه


انا كنت اظن ان New تنشى اوبجكت جديد من نفس النوع المشار اليه ( هههههههه غباء اه )
وكنت اقول هذا الاوبجكت الجديد مات ولم تحقق دالة الهدم


واكثر شئ فعلا افادنى هو الفرق بين

الانواع المرجعية (Reference type) و[b]
الانواع ذات القيمة (Value type)

اخى الشاكى لله اسئل الله تعالى ان يبارك لك فى دينك وعلمك ومالك واهلك

واخى الحبيب الغالى

3booody

[/b]
الرد }}}
تم الشكر بواسطة:
#9
ali.alfoly كتب :[b]جزاك الله خيرا وجعله فى موازين حسناتك يوم تلقاه


انا كنت اظن ان New تنشى اوبجكت جديد من نفس النوع المشار اليه ( هههههههه غباء اه )
وكنت اقول هذا الاوبجكت الجديد مات ولم تحقق دالة الهدم


واكثر شئ فعلا افادنى هو الفرق بين

الانواع المرجعية (Reference type) و[b]
الانواع ذات القيمة (Value type)

اخى الشاكى لله اسئل الله تعالى ان يبارك لك فى دينك وعلمك ومالك واهلك

واخى الحبيب الغالى

3booody

[/b]


الحمد لله انك فهمت

وللمعلومة فقط
يوجد فقط 2 من الانواع في الفيجوال بيسك ولي ذكرتهم سابقا (value type , reference type)

بينما في السي شارب توجد ال (value type , reference type) بلاضافة الى نوع ثالث يسمى (Pointer type)

--

شطحة : نصيحة من اخ لأخ

لاتضيع وقتك مع فيجوال بيسك ، إتجه لسي شارب مباشرة

لانك ستعاني لاحقا مع المصادر وقلة الامثلة والشروحات

مصادر السي شارب على النت اكثر بكثييييييير من الفيجوال

وخاصة مجال الشبكات ونظم التوزيع ، فلم ارى كتابا جيد يشرح ذلك

للفيجوال بيسك ، وحتى تقنيات مايكروسوفت تلقاها مشروحة في code project بالسي شارب فقط


الي يشوف طريقة تنظيم الكود في السي شارب ابدا مايتخيل نفسه يرجع للفيجوال بيسك
[/b]
الرد }}}
تم الشكر بواسطة:
#10
الشاكي لله كتب :


الحمد لله انك فهمت

وللمعلومة فقط
يوجد فقط 2 من الانواع في الفيجوال بيسك ولي ذكرتهم سابقا (value type , reference type)

بينما في السي شارب توجد ال (value type , reference type) بلاضافة الى نوع ثالث يسمى (Pointer type)

--

شطحة : نصيحة من اخ لأخ

لاتضيع وقتك مع فيجوال بيسك ، إتجه لسي شارب مباشرة

لانك ستعاني لاحقا مع المصادر وقلة الامثلة والشروحات

مصادر السي شارب على النت اكثر بكثييييييير من الفيجوال

وخاصة مجال الشبكات ونظم التوزيع ، فلم ارى كتابا جيد يشرح ذلك

للفيجوال بيسك ، وحتى تقنيات مايكروسوفت تلقاها مشروحة في code project بالسي شارب فقط


الي يشوف طريقة تنظيم الكود في السي شارب ابدا مايتخيل نفسه يرجع للفيجوال بيسك



بالفعل هذا ما فكرة فيه الايام الماضيه
رحت ادور على شروحات ASP.Net فوجدتها كلها مشروحة بالسى شارب فقررت باذن الله تعالى الاسبوع القادم ساتعلم السى شاري
لاكن انا كان عندى 10 اسطوانات لتعلم الفيجوال هما بالفعل ساعدونى كتير لما تكون دورة واحده كامله الواحد يرتاح من كل شويه دورة والى يقولو الاول يقولو الثانى
فهل هناك دورة كامله فى السى شارب
الرد }}}
تم الشكر بواسطة:



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


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