الأساس المنطقي وراء OverflowException يتم إلقاؤه بحجم صفيف سلبي؟

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

سؤال

بعد كتابة رمز يمكن غليه إلى ما يلي:

var size=-1;
var arr=new byte[size];

لقد فوجئت بأنها ألقيت الفائض. المستندات ل الفائض حالة:

الاستثناء الذي يتم إلقاؤه عند وجود عملية حسابية أو صب أو تحويل في سياق محدد ينتج عنه تدفق.

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

يتم التحقق من صحة القيم المحسوبة لأطوال البعد على النحو التالي. إذا كانت واحدة أو أكثر من القيم أقل من الصفر ، يتم إلقاء نظام.

أتساءل لماذا تم اختيار OverflowException. إنه أمر مضلل إلى حد ما إذا سألتني. لقد كلفني ذلك 5 دقائق على الأقل من التحقيق (لا أعتبر تأملاتي هنا). هل يمكن لأي شخص إلقاء أي ضوء على هذا (لتفكيري) قرار التصميم الخاص؟

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

المحلول

هذا بالتأكيد هو التحسين. يعد رمز إطار العمل .NET متدينًا إلى حد كبير حول التحقق من الحجج للسماح للمبرمج بقع في حفرة النجاح. لكن هذا لا يأتي مجانًا. التكلفة ضئيلة إلى حد ما ، والعديد من أساليب الطبقة تأخذ الكثير من دورات الماكينة مما تنفق على الفحص.

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

نصائح أخرى

الفائض, ، في الوثائق ، يحدد في الأساس تدفقًا على أنه شيء:

تنتج نتيجة خارج نطاق نوع البيانات

في هذه الحالة ، تكون القيم السلبية خارج النطاق الصحيح لحجم الصفيف (أو حقًا ، أي حجم).

أستطيع أن أرى حجة ذلك ingumentOutoToFrangeException قد يكون ، في بعض النواحي ، أفضل - ومع ذلك ، لا توجد حجة متورطة في تعريف الصفيف (باعتباره ليس طريقة) ، لذلك لن يكون اختيارًا مثاليًا.

قد يكون ذلك لأن هذا الحجم هو int غير موقعة. إنه يخزن -1 في مكمل اثنين ، والذي عندما ينظر إليه على أنه غير موقّع ، هو الحد الأقصى لعدد صحيح إيجابي يمكن تخزينه. إذا كان هذا الرقم أكبر من الحجم المحتمل للمصفوفة ، فسيتم تجاوزه.

تحذير: هذه تكهنات خالصة.

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