לדלג לתוכן

פתרון חקירת קוד שנוצר

הדוגמה הבאה מפרידה overflow סמנטי מאופן המימוש. בתוכנית המלאה אפשר להוסיף את בלוק קריאת ה־IL מההרצאה לכל אחת מן השיטות.

using System.Runtime.CompilerServices;

Console.WriteLine(Kernel.SumChecked(2, 3));
Console.WriteLine(Kernel.SumUnchecked(int.MaxValue, 1));
try { Console.WriteLine(Kernel.SumChecked(int.MaxValue, 1)); }
catch (OverflowException) { Console.WriteLine("overflow"); }

static class Kernel
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static int SumChecked(int a, int b) => checked(a + b);
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static int SumUnchecked(int a, int b) => unchecked(a + b);
}

הפונקציה הלא־בדוקה מחזירה int.MinValue עבור הקלט שגולש. הפונקציה הבדוקה זורקת OverflowException. ה־IL יכול לבטא את ההבחנה באמצעות add לעומת add.ovf, ואילו ה־JIT מחליט איך לבדוק את הדגלים או לייעל מקרה שהוא יכול להוכיח מראש. כאשר הקריאה נטמעת ב־caller, אין צורך שתישאר שיטה נפרדת בקוד החם.

ה־factory המפורש יכול להשתמש ב־switch על שם ולקבל new TextDecoder או new BinaryDecoder ישירות. כך נראים הבנאים כ־references סטטיים. אם המוצר חייב לגלות plugins שלא היו ידועים בזמן הפרסום, שינוי כזה אינו שקול פונקציונלית; צריך לבחור מודל הפצה שמתאים לדרישה. אין לתקן את האזהרה באמצעות מחיקת היכולת בלי לציין את שינוי החוזה. בדוח נשמור גם ניסוי שנכשל בגלל העדר toolchain, ונבדיל אותו מכשל תאימות של הקוד עצמו.