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


جائتني فكرة لكنها تتطلب إنشاء 100 كائن تقريبآ على الفورم
هل هذا بسيط على الذاكرة لانها مسببه لي عقده
مع العلم حتى اني لا استطيع استخدام Dispose لانها مرئيه على الفورم
هل عند  الخروج من البرنامج استخدم Dispose  ؟

السؤال الثاني : 
ماذا لو استخدم الكائنات مباشره بدون مغير
ماذا سيحدث بالذاكرة وهل هو افضل. مثال
me.controls.add(new control)
هل سيخزن الكائن في الذاكرة
اتمنى اعطائي معلومات عن هذه لانها مهمه بالنسبه لي
لدي معلومه واحده عنها وهي ان garbage collector سريع في عملية تنظيفها هل هذا صحيح
واضن ان السؤال مخصص في لغة الجافا لذلك لست متاكد

السؤال الثالث :
لدي مصفوفة عامه من نوع String وعدد عناصرها 20
واقوم بتغيير عناصرها باستمرار
السؤال هنا هل استخدم String او StringBuilder

السؤال الرابع : 
عن StringBuilder
تُـستخدم لبناء نصوص في حلقة تكرارية بدلآ من String لانها تنشئ مكان جديد بالذاكرة
واذا كان هناك نص ولن يتغير استخدم String
وماذا لو كان هنا نص صغير واقوم بتغييره لكن ليس كثيرآ
ماذا ساستخدم

سؤال الخامس :
لو كان هناك متغير عام من نوع String
وقمت بتغييره سيتم انشاء كائن جديد لكن هل الكائن القديم لن ينضفه الgarbage collector الا بعد انهاء البرنامج لانها عام ام؟

السؤال الاخير :  Huh
هل يُفضل استخدام  دالة في حلقة تكرارية
ولديها بارمتر من نوع String
او ماهو البديل لها
-

هذه الاسئلة حيرتني واذا عرفتها سارتاااااااااااح ^^ 
والله يوفقكم Heart
الرد }}}}
تم الشكر بواسطة:
#2
هذا يعتمد على نوع الكائن
مثلا 100 DataGridView غير TextBox

لكن أعتقد مئة ليس بالمخيف


لكن ما هي الفكرة، لأنه ممكن تكون هناك أفكار أفضل.



ما سر اهتمامك بالذاكرة
الرد }}}}
تم الشكر بواسطة: LoveVb , LoveVb
#3
فكرة البرنامج هي عارض خلفيات
يوجد بديل لها وهو عرضها في ListView مع ImageList
لكن اريد عرضها بشكل جميل ك أنشاء UserControl وتصميمه

ما سر اهتمامك بالذاكرة
لا اعرف لكن  اعتقد عند معرفتي ل Stack & Heap اهتميت به
ايضا String عند تغييرها قيمتها

صراحة انا معقد  اهتم بمعرفة تفاصيل البيانات وكيف تعمل حتى اني لم ادرس اساسيات اللغة كامله

استعمل خيالي لاتخيل البرنامج وكيف يعمل
ومستحيل استخدم كود بدون ماافهمه لاني لا استطيع تخيله
Confused
الرد }}}}
تم الشكر بواسطة:
#4
جمعت لك مجموعة دروست أرجو أن تجد الفائدة (خصوصاً الفيديو الأول)

dotNET Stack and Heap
https://www.youtube.com/watch?v=clOUdVDDzIM




Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing
http://www.codeproject.com/Articles/7615...alue-types

Differences between Stack and Heap
http://net-informations.com/faq/net/stack-heap.htm


وهذا الدرس بخصوص Value types و Reference types
Advanced C#: Lesson 3 - Value types vs Reference types
https://www.youtube.com/watch?v=mvieNUe9Urs
الرد }}}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله , LoveVb , LoveVb
#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 , السندبااد
#7
Control واحد سوف يغنيك عن 100 خاصة اذا كانوا من نفس النوع عموما عليك أن تقلق من كمية الصور و ليس من الكونترول
هناك شئ اخر انا لا أفهم ماذا تقصد بكلامك انك لا تستطيع استخدام الامر Dispose لأنها مرئية علي الفورم رجاء التوضيح
نصيحتي لك هي ان تضع فكرتك حيز التنفيذ أولا وبعد ذلك و أثناء التجارب و إن كان هناك مشاكل مع الذاكرة هنا عليك أن تقلق و تحاول أن تجد حلول للمشكلة
الرد }}}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله , LoveVb
#8
الله يسعدكم ويوفقكم
والف شكر لك اخوي الشاكي لله
كانت الاجوبة هذه مهمه جدا لي ووقفتني لمشاريع
والان سارتب الكود باستخدام متغيرات String قبل كنت احاول ان لا استخدمها وكان الكود طويل جدا   Confused



اخي silverlight
هل تقصد ان استخدم ListView افضل 
عند استخدام Dispose لكـنـترول على الفورم سيتم انهائه وسيختفى من على الفورم
وشكرا على النصيحة 

Heart
شكرا لكم  
الْلَّهُم صَلِّ وَسَلِم وَبَارِك عَلَى سَيِّدِنَا مُحَمَّد
الرد }}}}
تم الشكر بواسطة:
#9
اخي الشاكي لله اعتقد انك نسيت الاجابة على السؤال الاخير
هل يُفضل استخدام  دالة في حلقة تكرارية
ولديها بارمتر من نوع String
او ماهو البديل لها
-
مثل القيام ببناء نص ام؟
الْلَّهُم صَلِّ وَسَلِم وَبَارِك عَلَى سَيِّدِنَا مُحَمَّد
الرد }}}}
تم الشكر بواسطة:
#10
^ لم افهم ماتقصده بالضبط ارجو ان ترفق كود يوضح السؤال Smile
الرد }}}}
تم الشكر بواسطة: LoveVb


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


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