כשכותבים switch block, האם זה נשאר כך ? הנה התשובה
אז דברנו על זה שהקומפיילר מרגיש חופשי לשחק עם הקוד שלנו איך שנראה לו, ולהפוך בלוקים של switch לבלוקים של if, ואנחנו לא ממש מבינים מה הקומפיילר מנסה לעשות.
אז כשיש כאלו שאלות, למי פונים, כמובן לסשה.
אז שלחתי לו מייל עם השאלה, ואני מעתיק לכאן את התשובה שלו, ותודה על התשובה המפורטת.
הקומפיילר רשאי לממש את זה באיזה אופן שמתחשק לו, כל עוד הסמנטיקה של הקוד שלך נשמרת.
למשל, עבור switch על הרבה string-ים שונים הקומפיילר מייצר Dictionary ומשתמש בו כדי לבדוק לאיזה מקרה אתה מגיע (אתה יכול לבדוק את זה בקלות בעצמך, רק ב- Reflector אל תסתכל על C# אלא על IL).
עבור integral types, יש ממש instruction ב- IL שנקרא switch שמממש jump table.
כשיש רק שתי אפשרויות, הקומפיילר בוחר (וכנראה בצדק) להפוך את זה ל- if – זה גם מקצר את ה- IL שנוצר.
בסופו של יום, הכל מתקמפל ל- assembly ושם במילא כל הדבר הזה בדרך כלל לא יהיה ממומש באמצעות if-ים במקרה של enum רציף אלא על ידי חישוב של המקום שצריך לקפוץ אליו בהתאם לערך של ה- enum.
אם ה- enum לא רציף (כלומר הערכים לא עוקבים) זה יהפוך לסדרה של if-ים בכל מקרה, או אם יש רק ערך אחד שבאמת צריך לבדוק (כי אז שוב הקוד קצר יותר).