سؤال

    static void Main(string[] args)
    {
        var c2 = new Class2();
        var c3 = new Class3();
        var c1 = new Class1(c2, c3);
        c1.Method1();
    }

    class Class1
    {
        readonly Class2 _class2;
        readonly Class3 _class3;
        public Class1(Class2 class2, Class3 class3)
        {
            _class2 = class2;
            _class3 = class3;
        }
        public void Method1() {
            _class2.PerformM1();
            _class3.PerformM2();
        }
    }
    class Class2
    {
        public void PerformM1()
        {
            //do some operation
        }
    }
    class Class3
    {
        public void PerformM2()
        {
            //do some operation
        }
    }

السؤال على أساس الكود أعلاه:

  1. ما مقدار الذاكرة الموجودة في كائن Class1 عند إنشائه؟
  2. هل تزيد أي ذاكرة أو تقل عندما أقوم بتنفيذ c1.Method1 () ؛\ n مع الأخذ في الاعتبار أنه لا يوجد أي من الفصول الدراسية لديه أي حقول عامة \ n قد تشغل أي مساحة.

تعديل

التوسيع بسؤال واحد آخر:

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

يمكنني ببساطة إنشاء عدد ن من الكائنات وتعيين كائن فردي إلى مهمة فردية (أو موضوع)؟

هل كانت مفيدة؟

المحلول

  1. توضح المقالة التنقل داخل .NET Framework الداخلية لمعرفة كيفية إنشاء CLR كائنات وقت التشغيل (التي قد تكون قديمة بعض الشيء) أنه في .Net ، يأخذ كل كائن 8 بايت على الأقل (4 بايت لكتلة المزامنة ، 4 بايت لـ TypeHandle).Class1 له حقلي مثيل ، كلاهما مراجع.بافتراض أن الكود الخاص بك يعمل كتطبيق 32 بت ، فهذا يعني 4 بايت إضافية لكل مرجع.هذا يعني أن كل مثيل لـ Class1 يأخذ إجمالي 16 بايت.

    على الرغم من أن هذا يجعلني مرتبكًا بشأن لقبك ، لأن Class1 لديها بعض الحالة.

  2. الذاكرة الوحيدة المطلوبة مباشرة من خلال الاتصال بالرقم Method1() هي بعض المساحة المكدسة لإطار تنشيط المكالمة.لن تخصص أي ذاكرة من الكومة.

رغم أنه في النهاية ، من المرجح ألا يهمك كل هذا.


هل من الصحيح القول إنني لست بحاجة إلى قفل في نموذج الشفرة المقدم أعلاه.

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

نصائح أخرى

  1. يمكنك استخدام طريقة GC.GetTotalmemory (خطأ) لقياس الاستخدام الحالي للذاكرة.
  2. يمكنك أيضًا استخدام نوع من برامج تحليل الذاكرة مثل ملف تعريف ذاكرة ANTS من البوابة الحمراء

  3. يجب ألا يزيد استهلاك الذاكرة عند c1.Method1 () ؛يتم تنفيذ ذلك ، نظرًا لأن C2 و C3 لا تحتوي على أي كائنات مهيأة أو تشير إلى فئات أخرى تم تهيئة الكائنات بها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى softwareengineering.stackexchange
scroll top