חפיפת סי שארפ מתקדמת מאפרוח לאביר קוד


מדריך חפיפת סי שארפ מתקדם

ברוכים הבאים נחפפים!

קודם כל מה שלומכם? מה נשמע? האם אתם מוכנים להיות המאסטרים החדשים של סי שארפ? התשובה לכל השאלות הוא היא כמובן - כן! ועכשיו, בואו ניגש לעבודה.

תכנות מתקדם בסיסי

ראשית, נעבור על המדריכים המצויים באתר, על כל נושא אצרף שאלות מנחות על מנת שתוכלו לוודא הבנתכם את החומר.

  1. הפניות לפונקציות - לינק
    • מהו דלגייט ומה הוא תפקידו העיקרי?
      הצג תשובה
      דלגייט הוא סוג נתונים מיוחד המאפשר להחזיק הפניה לפונקציה. תפקידו העיקרי הוא לאפשר גמישות רבה יותר בתכנות, כגון:
      • העברת התנהגות כפרמטר לפונקציות אחרות.
      • יצירת אירועים המאפשרים תקשורת בין אובייקטים שונים.
      • שימוש בפונקציות אנונימיות וביטויי למבדה.

      "דלגייט ב-C# הוא סוג נתונים מיוחד המאפשר להחזיק הפניה לפונקציה. כך, [...] נוכל להשתמש במשתנה מסוג דלגייט כמו כל משתנה, ואפילו להכניסו כפרמטר לפונקצייה."
    • הסבר את ההבדל בין פונקציה אנונימית לביטוי למבדה?
      הצג תשובה

      • פונקציה אנונימית היא פונקציה שאינה קשורה לשם ספציפי, ומוגדרת במקום בו היא נדרשת. היא מספקת דרך ליצור פונקציות קטנות ופשוטות ללא הצורך בהגדרה נפרדת.
      • ביטוי למבדה הוא סינטקס מקוצר לפונקציה אנונימית. הוא מאפשר לכתוב פונקציות פשוטות בצורה קומפקטית יותר.

      "אבל זה לא הסוף, נוכל לצמצם עוד יותר את כתיבת הפונקצייה האנונימית על ידי ביטויי למבדה, שהינם דרך מקוצרת לרשום פונקצייה אנונימית."
    • מהו תפקידו של אירוע והקשר שלו לדלגייט?
      הצג תשובה
      אירוע הוא מנגנון המאפשר לאובייקט אחד להודיע לאובייקטים אחרים על התרחשות של פעולה מסוימת. אירוע מבוסס על דלגייט, כאשר הדלגייט מחזיק את רשימת הפונקציות שיופעלו כאשר האירוע יתרחש.
      "השימוש העיקרי של יכולת הזנת מספר הפניות פונקצייה לאותו המשתנה הוא ליצור דפוס של אירועים, ומה צריך להיעשות במידה והם קורים."
    • מה ההבדל העיקרי בין Action ל-Func ומהן תרחישים אופייניים לשימוש בכל אחד מהם?
      הצג תשובה
      Action ו-Func הם שני דלגייטים מוגדרים מראש המשמשים להחזקת הפניות לפונקציות. ההבדל העיקרי ביניהם טמון בסוג הערך שהם מחזירים:
      • Action: מייצג פונקציה שאינה מחזירה ערך (void). הוא משמש בדרך כלל להגדרת פעולות שצריך לבצע, כמו למשל:
        • אירועים: הרשמה לפונקציות שיתבצעו כאשר אירוע מסוים יתרחש.
        • פעולות אסינכרוניות: ביצוע פעולות ברקע מבלי לחכות להשלמתן.
      • Func: מייצג פונקציה המחזירה ערך מסוים. הוא משמש בדרך כלל להגדרת חישובים או טרנספורמציות על נתונים, כמו למשל:
        • פילטרים: סינון רשימות על בסיס קריטריון מסוים.
        • מיפוי: שינוי ערכי אוסף על פי פונקציה מסוימת.


  2. תכנות אסינכרוני - לינק
    • מה ההבדל העיקרי בין תכנות סנכרוני לתכנות אסינכרוני?
      הצג תשובה
      תכנות סנכרוני מבצע משימות באופן סדרתי, אחת אחרי השנייה, בעוד תכנות אסינכרוני מאפשר לבצע מספר משימות במקביל או בו זמנית. תכנות אסינכרוני משפר את ביצועי התוכנית, במיוחד במשימות I/O כמו קריאה לכתיבה לקבצים או לרשת.
      "כמו העובד במסעדה, גם המעבד שלנו נמצא בסיטואציה שבה הוא צריך לבצע מספר משימות בו זמנית. לדוגמא, אלחץ על כפתור להורדת שיר, אך תוך כדי שהשיר בתהליך הורדה, ארצה גם להמשיך להסתכל על סרטונים ביוטיוב."
    • הסבר את המושג "Task" (משימה) בקשר לתכנות אסינכרוני. מה היתרון בשימוש ב-Task לעומת יצירת תהליכונים (Threads) ישירות?
      הצג תשובה
      Task מייצג יחידת עבודה עצמאית שיכולה להתבצע במקביל למשימות אחרות. היתרון העיקרי של Tasks הוא בכך שהם מספקים מנגנון ניהול משימות מתקדם יותר, כולל יכולות כמו המתנה לתוצאות, ביטול משימות, וניהול שגיאות. בנוסף, מנוע המשימות מטפל ביעילות בחלוקת המשאבים בין המשימות השונות.
    • מהי המילה השמורה async ומה תפקידה בקוד אסינכרוני?
      הצג תשובה
      המילה השמורה async מציינת שפונקציה היא אסינכרונית, כלומר היא יכולה להשהות את ביצועה ולהמשיך ברגע שתוצאה של פעולה אסינכרונית אחרת שלה היא פנתה תהיה זמינה. היא מאפשרת כתיבת קוד אסינכרוני בצורה סינכרונית יותר, תוך שימוש במילה השמורה await.
      "על מנת להשתמש במילת הקוד await, נדרש להגדיר מראש שהקוד שנריץ הוא אסינכרוני. זאת עקב השוני עבור סביבת סי שארפ שבהרצת פעולה שיכולה לעבור בין כמה מעבדים לוגיים, אל בין פעולה רגילה שתעבוד בצורה סנכרונית על מעבד לוגי אחד."
    • הסבר את ההבדל בין await ו-wait(). מתי עדיף להשתמש ב-await?
      הצג תשובה
      await משמשת להשהיית ביצוע הקוד עד שמשימה מסוימת תושלם, אך מאפשרת למעבד הלוגי לטפל במשימות אחרות בזמן ההמתנה. wait() גורמת לThread הנוכחי להמתין שהמשימה תושלם, מה שעלול להשפיע על ביצועי התוכנית. עדיף להשתמש ב-await מכיוון שהוא מספק גישה יותר יעילה ואלגנטית לניהול משימות אסינכרוניות.
      "אמנם שתי הפעולות עוצרות את ביצוע הקוד עד שמשימה מסויימת ששלחנו תתבצע. אך יש בניהם הבדל מהותי. בעוד שכאשר נשתמש בawait על מנת להשהות את הקוד המעבד הלוגי יתפנה לבצע משימות אחרות, כשנשתמש בwait() המעבד הלוגי יחסם ולא יותר לשימוש אחר עד שהמשימה הסתיימה."

  3. בטיחות נאל - לינק
    • מה ההבדל בין משתנה מסוג string למשתנה מסוג string? מתי נעדיף להשתמש בכל אחד מהם?
      הצג תשובה
      • string: מייצג מחרוזת שאינה יכולה להיות null. כלומר, תמיד חייב להיות לה ערך כלשהו.
      • ?string: מייצג מחרוזת שיכולה להיות null, כלומר היא יכולה להכיל ערך או להיות ריקה.

      מתי נשתמש?
      • string: כאשר אנו בטוחים שמשתנה תמיד יכיל ערך, כמו שמות, כותרות וכו'.
      • ?string: כאשר ישנה אפשרות שהמשתנה לא יכיל ערך, כמו למשל כאשר מקבלים קלט ממשתמש או כאשר עובדים עם נתונים שמקורם במאגרי מידע חיצוניים.

    • הסבר את התפקיד של האופרטורים הבאים בקשר לבטיחות נאל: ?[], ?., ??, ??=, !,![].
      הצג תשובה
      • ?[]: מאפשר גישה למערך או לרשימה בצורה בטוחה. מחזיר null אם המערך הוא null.
      • ?.: מאפשר גישה למאפיין של אובייקט בצורה בטוחה, ומחזיר null אם האובייקט הוא null.
      • ??: מאפשר להחזיר ערך ברירת מחדל אם הביטוי משמאל הוא null.
      • ??=: מקצה ערך למשתנה משמאל רק אם ערכו הנוכחי הוא null.
      • !: מדכא את אזהרת בטיחות הנאל, אך יש להשתמש בו בזהירות שכן הוא עלול לגרום לשגיאות זמן ריצה אם הביטוי הוא אכן null.
      • ![]: גרסה של ! לגישה למערך.


  4. ניהול שגיאות - לינק
    • מה ההבדל בין העלאת שגיאה (throw) לבין תפיסת שגיאה (try-catch) ?
      הצג תשובה
      • העלאת שגיאה (throw): משמשת לסימון מצב חריג בתוכנית, ומפסיקה את ביצוע הקוד הנוכחי ומעבירה את השליטה לבלוק catch המתאים.
      • תפיסת שגיאה (try-catch): משמשת לטיפול בשגיאות שעלולות להתרחש בבלוק ה-try. אם שגיאה מתרחשת, הביצוע עובר לבלוק ה-catch המתאים, שם ניתן לטפל בשגיאה ולהמשיך בביצוע התוכנית.

    • הסבר את התפקיד של המאפיין InnerException באובייקט השגיאה.
      הצג תשובה
      המאפיין InnerException משמש לאחסון שגיאה פנימית שהובילה לשגיאה הנוכחית. זה מאפשר לבנות "שרשרת" של שגיאות, כאשר כל שגיאה מצביעה על השגיאה שהביאה ליצירתה.
    • מה היתרונות של שימוש בסוגי שגיאות ספציפיים במקום בשגיאה כללית?
      הצג תשובה
      • טיפול מותאם: ניתן לתפוס סוגי שגיאות שונים ולטפל בכל אחד מהם באופן שונה.
      • אבחון טוב יותר: שגיאות ספציפיות מספקות מידע מפורט יותר על הסיבה לשגיאה, מהמקל על איתור ופתרון הבעיה.
      • קוד ברור יותר: שימוש בסוגי שגיאות ספציפיים משפר את קריאות הקוד ומקל על הבנת התנהגות התוכנית.

    • הרחב באינטרנט וענה: מה הוא התפקיד של בלוק ה-finally. מתי כדאי להשתמש בו?
      הצג תשובה
      בלוק ה-finally מבטיח שהקוד שבתוכו יבוצע תמיד, בין אם התרחשה שגיאה ובין אם לא. זה שימושי למשימות ניקיון, כגון סגירת קבצים או שחרור משאבים, שצריך לבצע גם אם התוכנית נתקלת בשגיאה.
      כדאי להשתמש בו כאשר יש צורך לבצע פעולות ניקיון או שחרור משאבים, ללא קשר לתוצאת הביצוע של הבלוק ה-try. ניתן להשתמש בו גם ללא תפיסת כל שגיאה. וזה הרגל טוב להשתמש בו כשנרצה לבצע משימת נקיון לאחר שימוש במשאבים. מאחורי הקלעים using הוא קיצור דרך המבצע בדיוק את זה.



אין תגובות:

הוסף רשומת תגובה