لماذا استدعاء بعض وظائف فئة الكائن ، على مثيل من النوع البدائي ، تحتاج إلى الملاكمة؟

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

  •  24-09-2019
  •  | 
  •  

سؤال

لقد اكتشفت أنه إذا قمت بتشغيل خطوط التعليمات البرمجية التالية.

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

لم يتم القيام بالملاكمة ، ولكن إذا اتصلت i.GetType() (وظيفة أخرى مشتقة من System.Object) بدلا من GetHashCode(), ، سيُطلب من الملاكمة الاتصال GetType(), ، لماذا لا يمكن الاتصال GetType() على مثيل النوع البدائي مباشرة ، دون الملاكمة ، في حين أنه من الممكن الاتصال GetHashCode() بدون ملاكمة؟

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

المحلول

المفتاح هنا هو ذلك GetType() ليس افتراضيًا ولا يمكن تجاوزه. بما أن البنية هي بفعالية sealed, ، لا يمكن تجاوز الأساليب أكثر من البنية ، لذلك يمكن لوقت التشغيل والمترجم معالجة أساليب الهيكل التي تم تجاوزها كمكالمات ثابتة.

إذا كتبت بنية (نادرة) أنت ينبغي تجاوز جميع الطرق مثل ToString(), Equals(), GetHashCode() لهذا السبب بالضبط. إذا لم تكن يجب أن يكون المربع. لكن، GetType() لا تستطيع يتم تجاوزها ، وبالتالي يحتاج إلى الملاكمة.

هذا يؤدي في الواقع إلى بعض حالات الحافة الفردية مع Nullable<T> والملاكمة منذ فارغ Nullable<T> صناديق ل null, ، لذا:

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

نصائح أخرى

أعتقد أن السبب هو أن GethashCode يتم تنفيذها على System.Int32 مباشرة ، يمكنك الاتصال بـ System.Int32 :: GethashCode (). لا حاجة إلى مربع إذا اتصلت بوظيفة عضو معروفة على نوع القيمة.

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