DCSIMG
כשכותבים switch block, האם זה נשאר כך ? הנה התשובה - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

כשכותבים 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-ים בכל מקרה, או אם יש רק ערך אחד שבאמת צריך לבדוק (כי אז שוב הקוד קצר יותר).

פורסם: Dec 21 2008, 10:00 PM by Shlomo | with 2 comment(s)
תגים:,

תוכן התגובה

Shlomo כתב/ה:

Process process = Process.Start("notepad");

process.PriorityClass = ProcessPriorityClass.High;

אצלי זה עובד, תנסה לפרט יותר אם זה עדיין לא עובד לך

# December 22, 2008 7:21 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 4 and 4 and type the answer here:


Enter the numbers above: