سؤال

نقلا عن رابط MSDN لفئة ValueType

في الحالات التي يكون فيها من الضروري أن يتصرف نوع القيمة ككائن، يتم تخصيص غلاف يجعل نوع القيمة يبدو ككائن مرجعي في الكومة، ويتم نسخ قيمة نوع القيمة فيه.يتم وضع علامة على المجمّع حتى يعرف النظام أنه يحتوي على نوع قيمة.

هذا يعني أنه عندما أقوم برمز "integervariable.toString () ؛" يتيح الكائن المربى الذي تم إنشاؤه استخدام هذه الطريقة وبالمثل جميع الطرق الأخرى لـ System.Object.

فهل هذا الفهم صحيح؟

كيف تختلف هذه الكائنات عن الكائنات "العادية"؟

هل تختلف مجموعة البيانات المهملة بالنسبة لمثل هذا الكائن؟إذا كانت الإجابة بنعم، كيف؟

شكرا لك مقدما.

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

المحلول

الغلاف عبارة عن "صندوق" ؛إعادة جمع القمامة من الصناديق - هناك لا الفرق بقدر ما يتعلق الأمر بجامع Grabage.يتم جمع الصندوق بنفس القواعد والمعاملة تمامًا مثل أي كائن آخر.

ومع ذلك، إذا تجاوز نوع القيمة إحدى الطرق (مثل ToString())، ليس من الضروري وضع مربع عليه لاستدعاء الطريقة.ومن ثم، ينبغي لأنواع القيمة (كمسألة روتينية) أن تتجاوز أكبر عدد ممكن من القيم object الطرق قدر الإمكان ؛-ص

يمكنك رؤية الفرق في IL (عبر العاكس) - لذلك بالنسبة لـ C#:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

لدينا إيل:

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

لاحظ أن ToString() لا تتضمن صندوقًا، ولكن GetType() يفعل في L_0007 (لأنه لا (لا يمكن) تجاوزه)

نصائح أخرى

نعم هذا الفهم هو الصحيح.

وهذه الكائنات لا تختلف عن الكائنات العادية "في CLR.

وبما أن هذه الكائنات (تسمى أيضا "صناديق" بيكوس أنها التفاف أنواع القيمة) هي تماما مثل أي كائن آخر جامع القمامة هو نفسه أيضا.

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