هل يتم تعبئة النمط الثامن عندما يتم إعلانه كجزء من الفصل؟

StackOverflow https://stackoverflow.com/questions/4216612

سؤال

النظر في هذا الفصل:

public class Foo
{
    public Int32 MyField;
}

أظن أن عضو "MyField" ليس على مكدس الخيط لأنه يمكن الوصول إليه من قبل العديد من المواضيع ، يجب أن يكون بالتأكيد في الكومة المدارة ، ولكن هل يعني أنه محاصر وغير محصور في كل مرة يتم استخدامه؟

شكرا لك مقدما

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

المحلول

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

في حالتك ، كيف تتصرف على MyField ستحدد ما إذا كان محاصرًا ، وليس كيفية معاملة Foo.

  //No Boxing
  var f = new Foo();
  f.MyField = 5;
  int val = f.MyField;


  //Boxing
  var f = new Foo();
  f.MyFIeld = 5;
  object val = f.MyField;

لاحظ أنه في المثال الثاني val الآن يحتوي على إشارة إلى int محاصر. MyField لا يزال (وسيبقى دائمًا) عبارة عن int غير مربعة ويمكن الوصول إليه دون إلغاء اللاصطناع (شكرًا على الإشارة إلى التوضيح المطلوب ، لوكه)

نصائح أخرى

لا ، نوع القيمة غير محاصر.

يحدث الملاكمة فقط عند استخدام نوع القيمة كما لو كان كائنًا ، على سبيل المثال عند تخزين AN int في مجموعة من object. إنه:

object[] a = new object[10];
int x = 1;
a[0] = x;

في هذه الحالة ، يكون نوع القيمة محاصرًا.

لكن نوع القيمة المخزّن كحقل داخل الفصل غير محاصر.

لا ، يحدث الملاكمة فقط عندما يتم التعامل مع نوع القيمة كنظام.

يتم محاذاة أنواع القيمة فقط عندما يتم تعيينها إلى متغير نوع المرجع (على سبيل المثال object). إذا لم تخصص أبدًا MyField إلى أي شيء آخر غير int أو بنية أخرى يمكن إلقاؤها (على سبيل المثال double) ، لن يكون محاصرًا أبدًا.

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