الملاكمة والملاكمة ، لماذا لا تكون مخرجات "System.Object"؟

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

  •  27-09-2019
  •  | 
  •  

سؤال

حصلت على الرمز التالي:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

الإخراج هو:

System.Int32
System.Object

لماذا ليسا كلاهما System.Object?

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

المحلول

إذا كنت تسأل عن سبب عدم إرجاع boxedObject.getType () كائن .. تحقق من الصورة ضمن قسم "تحويل الملاكمة" على ال صفحة الملاكمة والملاكمة MSDN. سؤال جيد بالمناسبة .. على الأقل فهمي لسؤالك.

على الرغم من أنني قد لا أكون صحيحًا من الناحية الفنية ، إلا أنه يبدو

  • عند نقله إلى الكومة ، يتم إنشاء كائن جديد - تم تعيين مؤشر النوع الخاص به على كائن نوع القيمة الأصلي (هنا system.int32). هذا ما يفسر gettype () (وأيضًا الخطأ إذا حاولت إلغاء صناديقه إلى نوع مختلف).
  • ثم يتم نسخ القيمة الفعلية إلى هذا الكائن.

نصائح أخرى

ال GetType() تُرجع الدالة النوع الفعلي للمثال في المتغير.

على الرغم من أن متغيرك يُعلن باسم object, ، انها في الواقع تحتجز محاصر Int32 نموذج.

بتجاهل موضوع الملاكمة ، ترث جميع الفئات من كائن النوع. هذا صحيح لكل من الأنواع المرجعية وأنواع القيمة. يعرض Gettype النوع الأكثر اشتقاقًا ، والذي في هذه الحالة هو System.Int32.

واحدة من المرات القليلة التي ستعود فيها Gettype.

object var = new Object();
Console.WriteLine(var.GetType().ToString());

يشير الملاكمة إلى متى يتم الإشارة إلى نوع القيمة بواسطة نوع مرجعي. بشكل عام يتم ذلك كمرجع System.Object. سيعود Typeof إلى النوع الفعلي الأكثر اشتقاقًا ، وليس نوع المرجع.

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

ستفعل Gettype أشياء مماثلة لهذه الأنواع.

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());

فئة
الصف ب
فئة ج

هذا لا يتعلق حقًا بالملاكمة ؛ هذا عن سلوك GetType. يعيد نوع القيمة من المتغير ، وليس النوع الذي كان المتغير أعلن مع:

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

لن تعود System.Object أيضاً.

إعلانات المتغير هي معلومات وقت الترجمة فقط في حين أن تنفيذ الطريقة هو وقت التشغيل. بمعنى آخر ، لا توجد طريقة يمكن لـ GetType () معرفة النوع الذي تم الإعلان عن الكائن لأنه لا يمكن إلا أن يعرف النوع الفعلي للكائن في وقت التشغيل.

مماثل إذا كان لديك

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

لا توجد طريقة لمعرفة الدعوة إلى binstance.gettype () عن معرفة أن المتغير تم الإعلان عنه كنوع "A" ولا أعتقد أنك تتوقع أن تعيد "A" في هذه الحالة أيضًا. ومع ذلك ، في المثال أعلاه A هو اختصاري للكائن و B هو للنظام. int32

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