سؤال

آخر حديثة C # سؤال كان لدي كان إذا كنت أعرف ما هو الملاكمة والعلوك. أوضحت أن أنواع القيمة هي على كومة وأنواع مرجعية على كومة الكومة. عند إجراء قيمة إلى نوع مرجعي، نسميها للملاكمة والعكس صحيح.

ثم طلب مني حساب هذا:

int i = 20;
object j = i;
j = 50;

ما هو i?

لقد افسدتها وقالت 50، حيث 20 عاما. الآن أعتقد أن أفهم ذلك، ولكن عندما كنت ألعب بمجموعات مختلفة، فوجئت برؤية هذا:

Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing

كنت أتوقع أن أرى b == 2 كذلك، ولكن ليس كذلك، لماذا؟ هل ذلك لأن الملاكمة الثانية يدمر ويحل محل الكل a كائن على كومة؟

لأنه إذا قمت بذلك، فلا بأس:

public class TT
{
    public int x;
}

TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;

ما هو t2.xب يجب أن يكون 3، وهو كذلك. ولكن هذا ليس مثالا على الملاكمة / Unboxing على الإطلاق، هل هذا صحيح؟ فكيف يمكنك تلخيص هذا؟

هل يمكن أن تصبح القيم هي نفسها في تحويل الملاكمة / إلغاء تثبيت على النحو الوارد أعلاه؟

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

المحلول

  1. أنت على حق التعيين الثاني يحل محل الأول. لا يغير القيمة المعبئة.

  2. مثالك لا يستخدم من الملاكمة. يتم تخزين القيمة (int) باعتبارها int وغير محاصر.

  3. لا، لا يزال الملاكمة يبقي ضمان عدم القدرة.

نصائح أخرى

قصيرة جدا: يعني الملاكمة إنشاء مثيل جديد لنوع مرجعي. وبعد إذا كنت تعرف هذا، فأنت تفهم أن مثيل واحد لا يتغير عن طريق إنشاء آخر.

ماذا تفعل مع a = 2 لا يغير القيمة في "مربع"، فأنت تقوم بإنشاء مثيل جديد لنوع مرجعي. فلماذا يتغير أي شيء آخر؟

كنت أتوقع أن أرى ب == 2 كذلك، ولكن ليس كذلك، لماذا؟ هل هو لأن الملاكمة الثانية يدمر ويحل محل الكل (أ) -Object على كومة؟

لا، ليس بالضبط. إنه يترك الكائن كما هو على كومة b المتغير هو أيضا الرجوع إليه) ويخلق كائنا جديدا للقيمة الجديدة، والتي a سوف المرجع المتغير.

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

لا حتى هيكل قابل للتغيير مثل Point يمكن تغييرها عند محاصر. للوصول إلى خصائص الصياغة لديك ل Unbox، لذلك لا يمكنك تغيير الهيكل المحاصر في مكانه.

إليك تباين آخر مثير للاهتمام يدعم تعليقات ستيفان:

        int i = 2;
        object a = i; // Boxing
        object b = a; // Referencing same address on heap as 'a', b == a

        b = i; // New boxing on heap with reference new address, b != a

B لا يزال 1 لأن B هو مرجع لا يزال يشير إلى الكائن الموجود على كومة الكومة بقيمة 1. A هو 2 لأنك قمت بتعيينه إلى كائن جديد على الكومة بقيمة 2.

T2.x هو 3 لأن T و T2 مراجعتين مختلفة بنفس الكائن على كومة الكومة.

أعتقد أن الإجابة على سؤالك مع Unboxing هي: نتيجة تحويل Uncoxing هو متغير مؤقت (مزيد من التفاصيل: حلقة الوصل).

أعتقد أنك كنت تحاول القيام بذلك مثل:

object a = new Point(10,10);
object b = new Point(20,20);
a = b;

((Point) b).X = 30; //after this operation also a.X should be 30

لن تجميع الكود أعلاه - التفاصيل في الرابط أعلاه، وأعتقد أن هذا هو الحل على سؤالك:

كنت أتوقع أن أرى ب == 2 كذلك، ولكن ليس كذلك، لماذا؟ هل هو لأن الملاكمة الثانية يدمر ويحل محل الكل (أ) -Object على كومة؟

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