تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الكائنات والذاكرة
#6
السؤال الاول : 100 كائن على الفورم ابدا ليس بالشيئ الكثير واذا كنت تريد حساب الاستهلاك بدقة تستطيع استعمال احدى تقنيات الprofiling لفحص الاداء واستهلاك الذاكرة.


--

السؤال الثاني : طبعا هناك فرق بين تعريف متغير من Instance  ، وبين تمرير الـInstance مباشرة الى الدالة بدون تعريف متغير :-
PHP كود :
       private void Form1_Load(object senderEventArgs e)
 
       {
 
           //ليست الطريقة الافضل للذاكرة
 
           FileInfo sw = new FileInfo ();
 
           LoadFile(sw);
 
       }

 
       void LoadFile(FileInfo info)
 
       {
 
           //...  
 
       

بينما عند تمرير Instance مباشرة بدون تعريف متغير هنا يكون الوضع افضل قليلا بالنسبة للذاكرة :
PHP كود :
       private void Form1_Load(object senderEventArgs e)
 
       {
 
       //افضل للذاكرة نوعا ما(ليس بالضرورة)
 
           LoadFile(new FileInfo());
 
       }

 
       void LoadFile(FileInfo info)
 
       {
 
           //...  
 
       

والسبب في ذلك ان الـ Garbage Collector تقوم بحذف الكائن من الذاكرة عندما لايوجد مؤشر للكائن.


في الاقتباس الاول قمنا بتعريف متغير(مؤشر) باسم sw يشير الى كائن جديد من FileInfo
وهذا المتغير sw سيعيش معنا طوال فترة تنفيذ الدالة Form_Load حيث كما تعلم انه متغير محلي على مستوى دالة وسيموت بمجرد انتهاء الدالة من تنفيذ جميع اكوادها .

في الاقتباس الثاني قمنا بتمرير الكائن مباشرة بواسطة new الى الدالة . ونتيجة لذلك ، تم اسناد الكائن الى الparameter الخاص بالدالة LoadFile مباشرة ، والParameter بطبيعة الحال سيموت مع انتهاء الدالة LoadFile من جميع اكوادها

وبطبيعة الحال نعرف دالة LoadFile ستنهي اكوادها قبل الدالة Form_Load ، لذلك الاقتباس الثاني هو الاصح بسبب ان مؤشر الكائن سيموت اسرع وعندما يموت مؤشر الكائن ، سيعتبر ذلك علامة للـ Garbage collector بان يقوم بحذف الكائن من الMemory، ولكن تذكر ان كل هذا الكلام كله عمليا ليس صحيحا تماما ، والسبب انننا لانعرف متى ستقوم ال Garbage Collector بمسح الكائنات من الذاكرة ، ربما سيقوم بمسحها بعد 3 دقائق  لذلك لن يفرق لو استخدمت الاقتباس الاول او الاقتباس الثاني (الا اذا اردت توفير 32 بت من الذاكرة حيث ان المتغير الذي يشير الى الكائن هو عبارة عن Native Pointer وحجمه على حسب معمارية الCPU اي انه في معالجات ال32 بت سيكون حجم المتغير sw بالضبط 32 بت (4 بايت) بينما في معالجات ال64 بت سيكون خجمه 64 بت (8 بايت)

فاذا اردت توفير هذه البايتات بالتاكيد سيكون الاقتباس الثاني افضل لك Smile
(ولكن توفير هذه البايتات البسيطة ليس بالامر العظيم ههههه)


--

السؤال الثالث : بالطبع استخدم string ،لاحاجة ابدا للstringBuilder


--


السؤال الرابع : كلامك صحيح نستخدم الـ StringBuilder عندما نريد اسناد النصوص بواسطة & او + (في سي شارب) والسبب في ذلك انت تعرفه ، وهو ان string تقوم باضافة بيانات جديدة الى الذاكرة بدل القيام بتعديلها وهذا يسبب استهلاك كبير للذاكرة .. اما موضوع كان التغيير كبيرا او كان صغيرا هذا حسب تقديرك لهذا الامر ، وتذكر ليست جميع الاجهزة متساوية في الامكانيات ، تطبيقك قد يقوم شخص ما بتشغيله على جهاز يحتوي على ram 8 GB ـ هل تضن ان هذا الموضوع ممكن يسبب مشكلة هههه مستحيل .

وتذكر دائما ان الـ Garbage Collector تقوم بحذف الكائن من الذاكرة (سواء كان class او نص او رقم) كله يتم مسحه من الذاكرة عندما لا يؤشر عليه أحد ، فمثلا الكود التالي لن يسبب اي مشكلة لنا :-
PHP كود :
       private void Form1_Load(object senderEventArgs e)
 
       {
 
         string website "vb4arb.com";

 
           website "google.com";
 
       
المتغير website يشير اولا الى النص vb4arb.com ، لكن بمجرد ان تقوم باسناد نص  اخر الى نفس المتغير (بدون &) ، سينتقل المتغير للاشارة الى النص الجديد (google.com) وهذا يعني ان النص vb4arb.com سيتم حذفه من الذاكرة لان لايوجد احد يشير اليه Smile

فكما ترى ، الgarbge تعمل بنفس الطريقة سواء كان المتغير يشير الى class او الى نص او الى رقم . لايهم ، الGarbge ستخسف به مادام الكائن ضمن دائرة الـ   Managed Code


--

السؤال الخامس : لا ليس بالضرورة عند اغلاق  التطبيق ، التطبيق ليس له دخل ابدا بعمل الgarbge collector ، فالgarbge سيقوم بحذف المتغير العام عند موت الclass الحاضن له ، فلو كان المتغير معرفا في class مثلا form2 ، فاذن المتغير سيتم تنضيفه عندما تقوم انت باغلاق الform2 ، لانك عندما تقوم باغلاق الForm2  ، ستكون قد دمرت الclass الخاص به   .. من هنا اقول لك صحيح كلامك ، ربما لايتم تدمير المتغير المعرف على مستوى الform الاساسي للتطبيق ، اذ ان المتغير المعرف على مستوى الform او (class) الاساسي في التطبيق ، لن يتم تنظيفه ما لم يتم اغلاق البرنامج .... طبعا فيه استثنائات لهذه الحالة مثل : اسناد Nothing الى المتغير العام ، وبهذا انت ببساطة قمت بتخليص المتغير المسكين من الكائن الذي يشير اليه ، فسيتم تنظيف الكائن الذي لم يعد احد يشير اليه وذلك دون الحاجة الى اغلاق البرنامج Smile




--



امل اني وضحت المسئلة بشكل جيد ، وتذكر موضوع الGarbge سهل جدا ولكن يجب عليك القراءة عنه بالتفصيل ، والاخ الوادي جزاه الله خيرا ماقصر معك Smile
الرد }}}
تم الشكر بواسطة: LoveVb , السندبااد


الردود في هذا الموضوع
الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 07:36 AM
RE: الكائنات والذاكرة - بواسطة الوادي - 22-07-16, 08:28 AM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 08:47 AM
RE: الكائنات والذاكرة - بواسطة الوادي - 22-07-16, 10:35 AM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 11:46 AM
RE: الكائنات والذاكرة - بواسطة الشاكي لله - 22-07-16, 11:58 AM
RE: الكائنات والذاكرة - بواسطة silverlight - 22-07-16, 12:23 PM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 03:31 PM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 07:09 PM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 08:50 PM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 09:44 PM
RE: الكائنات والذاكرة - بواسطة LoveVb - 22-07-16, 10:13 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] كيف اجعل الفورم يعمل على جميع الشاشات بدون تغيير او ضياع الكائنات داخل الفورم في vb.n اسيل1 1 2,281 20-06-18, 06:20 PM
آخر رد: محمد كريّم
  [سؤال] اضافة اسماء الكائنات الموجودة بالفورم بListbox Basil Abdallah 5 2,413 25-01-18, 08:42 PM
آخر رد: Basil Abdallah
Lightbulb الفئات و الكائنات s.d.k 3 2,859 08-08-17, 12:10 PM
آخر رد: s.d.k

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


يقوم بقرائة الموضوع: