ال

الطفح في C#

1 تمرين

نبذة عن الطفح

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

  • ستلتف الأعداد الصحيحة غير المؤشّرة (byte وushort وuint وulong) عائدة إلى الصفر (تعمل القيمة العظمى للنوع + 1 بمثابة مقياس) ما لم تظهر، بشكل عام، داخل كتلة checked، وفي هذه الحالة تُطرح نسخة من OverflowException. وسيتصرف int وlong بطريقة مشابهة، إلا أنهما يلتفان إلى int.MinValue وlong.minValue على الترتيب.
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • إذا تسبب تعبير حرفي في تجاوز المتغير المُسند إليه، فسيحدث خطأ في وقت الترجمة.
  • تنطبق حالة checked على التعبيرات الموجودة مباشرة في الكتلة فقط، ولا تُلتقط حالات التجاوز في الدوال المستدعاة.
  • تتخذ الأنواع float وdouble حالة اللانهاية التي يمكن اختبارها باستخدام float.IsInfinity() وما شابه.
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • ستتسبب الأعداد من النوع decimal في طرح نسخة من OverflowException.
  • توجد كلمة مفتاحية مقابلة هي unchecked للحالات التي تريد فيها عكس أثر unchecked داخل كتلة checked، أو عندما يكون قد جرى استخدام إعداد المُترجم.

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

يمكن التخفيف من مشكلات التجاوز في int وfloat عبر إسناد النتيجة إلى متغير من النوع long أو decimal أو double.

إذا كانت الأعداد الصحيحة الكبيرة ضرورية في الكود الخاص بك، فإن استخدام النوع BigInteger يعد خيارًا متاحًا.

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

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

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم الطفح