سؤال

سؤال سخيف ، ولكن في تطبيق winforms أعمل حاليًا ، أود الحصول على مقدار البايتات المخصصة/المستخدمة من قبل أ List<[SomeObject]> عقدت في الذاكرة (لأغراض إحصائية). هل هذا ممكن؟ لقد بحثت من خلال الخيارات الممكنة ، ولكن من الواضح أنه لا يوجد myList.GetTotalBytes() طريقة.

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

المحلول

لست متأكدًا من أن وقت التشغيل يوفر طريقة برمجية موثوقة للحصول على حجم الكائن ، ولكن هناك بعض الخيارات مفتوحة لك:

  • استخدم أداة مثل CLR Profiler
  • استعمال Marshal.sizeof () (يعيد الحجم غير المدير للكائن)
  • قم بتسلسل هدفك إلى ثنائي لتقريب

نصائح أخرى

يعتمد الأمر حقًا على ما تعنيه. يمكنك التنبؤ بعدد البايتات التي سيتم استخدامها من قبل القائمة نفسها - ولكن هذا ليس هو نفسه التنبؤ بعدد البايتات التي قد تكون مؤهلة لجمع القمامة إذا أصبحت القائمة مؤهلة للتجميع.

أجزاء من القائمة:

  • صفيف الدعم (T[] - إشارة إلى صفيف مفاده أن القائمة فقط سيكون لها حق الوصول إليها)
  • الحجم (int)
  • جذر المزامنة (مرجع)
  • رقم الإصدار (int)

البت الصعب هو تحديد مقدار العد. من السهل حساب كل منها (خاصة إذا كنت تعلم أن T هو نوع مرجعي ، على سبيل المثال) ولكن هل تريد حساب الكائنات المشار إليها حسب القائمة؟ هل تلك المراجع هي الوحيدة أم لا؟

أنت تقول أنك تريد أن تعرف "لأغراض إحصائية" - هل يمكن أن تكون أكثر دقة؟ إذا كنت تستطيع أن تقول ما تهتم به حقًا (ومزيد من المعلومات حول ما هو موجود في القائمة وما إذا كانت هناك إشارات أخرى إلى نفس الكائنات) ربما يمكننا المساعدة أكثر.

قد تكون هذه إجابة كاملة الحمل ، لكنني سأخرج على أحد الأطراف وأقول ما إذا كنت تقوم بمقارنات إحصائية ، قم بإجراء تسلسل ثنائي للكائن MemoryStream ثم انظر إلى Length الممتلكات على هذا النحو:

    List<string> list = new List<string>
    {
        "This",
        "is",
        "a",
        "test"
    };

    using (Stream stream = new MemoryStream())
    {
        IFormatter formatter = new BinaryFormatter();

        formatter.Serialize(stream, list);
        Console.WriteLine(stream.Length);
    }

لاحظ أن هذا يمكن أن يتغير بين الإصدارات المختلفة من الإطار وسيكون مفيدًا فقط للمقارنات بين الرسوم البيانية للكائنات داخل برنامج واحد.

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