هل يتم تعبئة النمط الثامن عندما يتم إعلانه كجزء من الفصل؟
-
26-09-2019 - |
سؤال
النظر في هذا الفصل:
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
) ، لن يكون محاصرًا أبدًا.