
times: 3. אפשר לשלוח את הפרמטרים בסדר אחר מזה של ההגדרה.dynamic מקבל כל ערך, והקומפיילר לא בודק את החברים שלו בזמן הקומפילציה. הבדיקה נעשית בזמן הריצה.out ו-in בהגדרת הממשק קובעות את הכיוון.out מאפשר להחזיר אוסף של מחלקה נגזרת כאוסף של מחלקת הבסיס. לכן אוסף של Employee נשלח לפונקציה שמצפה לאוסף של Person.in מאפשר להשתמש במשווה שמיועד ל-Person על רשימה של Employee.הטקסט המלא של הדקות הראשונות בהרצאה «חידושים ב-C# ver 4» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים ל-C-Sharp 4 שיצאה ביחד עם Visual Studio 2010 בשנת 2010 והחידושים שהתווספו ב-C-Sharp 4 הם החידושים הבאים Optional Parameters מאפשר לנו להגדיר ערכי ברירת מחדל לפרמטרים שמתקבלים לפונקציה Named Parameters מאפשר לנו להגדיר אילו פרמטרים אנחנו רוצים להכניס אליהם את הערכים
שאנחנו שולחים לפונקציה. המילה השמורה dynamic שמאפשרת לנו להגדיר משתנה שאפשר להכניס אליו כל ערך, להשתמש עם פונקציות שיש בו, אך בזמן הקומפילציה קיום הפונקציות לא באמת נבדק אלא רק בזמן הריצה.
אנחנו הולכים לראות דוגמה לכל אחד מהדברים האלה. ונושא שנקרא covariance וcontravariance, אנחנו הולכים לראות מה זה בדיוק אומר הדבר הזה ואיך זה שימושי.
אז בואו נצלול ונראה דוגמה אחת מכל אחד מהדברים האלה. הדבר הראשון שאנחנו הולכים לראות זה את ה-Optional Parameters.
ה-Optional Parameters מתייחס לפונקציות ולפרמטרים שהפונקציות מקבלות. בואו נניח שאנחנו כותבים איזושהי פונקציה, נקרא לה פרינט, ואנחנו רוצים בפרינט הזאת לקבל String Message.
אוקיי, אז בואו פשוט נציג את המסאג', נקרא לפונקציה, נריץ והכל עובד כמו שצריך. עכשיו, מה קורה אם אנחנו רוצים לבצע עוד העמסה של הפונקציה, כלומר לכתוב פונקציה עם שם דומה אבל עם מספר פרמטרים או טיפוס פרמטרים שונה, ושתבצע כמובן את אותו
הדבר אחרת לא הייתי קורא לה באותו השם. בוא נניח שהפונקציה הנוספת שאני רוצה לכתוב תקבל גם מסאג', וגם באיזה צבע להציג את המסג'.
אז אין לנו שום בעיה לבצע את ההעמסה הזאת, בואו נשלים את הפונקציה. console. foregroundColor יקבל את ה-Color, סיום ההדפסה, קונסול נחזיר את ה-Color למצב ה-Defaultי שלו, ואנחנו אומרים כזה דבר: יש לנו עכשיו שתי פונקציות, הן מועמסות, אנחנו יכולים לקרוא על ידי Hello לפונקציה הראשונה,
מפני שזאת החתימה שלה, ואנחנו יכולים לקרוא, שימו לב שאנחנו יכולים לדפדף פה בין שתי החתימות ולקרוא גם לפונקציה עם החתימה השנייה, לשלוח לה איזשהו צבע וכל פעם תתבצע קפיצה לפונקציה אחרת.
בואו נבצע העמסה נוספת ונגדיר שהפעם אנחנו מקבלים int times ופה אנחנו אומרים בעצם כמה פעמים אנחנו רוצים להדפיס את ה-message.
נרוץ פה Add Times ואת ההדפסה נעשה פה. אם עכשיו אנחנו באים ואומרים בעצם אנחנו רוצים לקרוא ל-Print אבל לשלוח לה, או נשלח פה First Message, נשלח כאן Second Message ונשלח כאן Third Message בכדי לראות את ההבדלים ביניהם, אנחנו יכולים להגיד לו Color Red ואנחנו רוצים ארבע פעמים.
שימו לב שיש פה קריאה לכל אחת מהפונקציות והכל עובד כמו שצריך. מה הבעיה עם הקוד הזה? יש פה שכפולים של קוד. לכן כאשר תמיד היינו מבצעים את הקונספט של ההעמסות של הפונקציות לא היינו משכפלים קוד אלא היינו כותבים את כל הפונקציה כנראה בדרך כלל זה יהיה בפונקציה שמקבלת הכי הרבה פרמטרים ומהפונקציות שמקבלות
פחות פרמטרים היינו קוראים לפונקציות שמקבלות הרבה פרמטרים ורק שולחים להם את הערכים עם ערכי default אחרים. לדוגמה, היינו שולחים print message עם color ו-times 1, ואז היינו יכולים לחסוך את שלושת השורות האלה.
ופה היינו צריכים לקרוא ל-print ולשלוח רק את המסג' עם איזשהו default color. נשלח color.gray, אם אני לא טועה, זה ה-default color של הקונסול. וכך מה שהיינו יכולים לעשות זה פשוט לכתוב רק את התוכן כאן ולשלוח מהפונקציה השנייה לפונקציה השלישית עם איזשהו ערך ברירת מחדל, מהפונקציה הראשונה לפונקציה השנייה עם איזשהו
ערך ברירת מחדל והכל אמור לעבוד אותו הדבר בלי לחזור על שורות קוד. אחלה.
אבל אם שמתם לב עדיין כתבנו פה את שתי הפונקציות האלה רק בשביל לבצע את הקריאות וזה קצת מיותר. אוקיי בואו את כל אלה נשים בצד ונראה מה זה optional parameters.
optional parameters מאפשר לנו לכתוב פונקציה פעם אחת. נכתוב את הפונקציה print, הפונקציה תקבל את כל הערכים, יש לנו פה למעשה את שלושת אלה, נעתיק, נדביק וכמובן נכתוב את הקוד שלהם בצורה כזאת.
אז אנחנו רואים שיש לנו כאן את כל הערכים ולכן הקריאה השלישית עובדת ואין לנו שתי קריאות, אין לנו שתי פונקציות ראשונות שמקבלות רק את המסאג' ופונקציה אחרת שמקבלת מסאג' וגרין.
אבל אנחנו יכולים לבוא ולעשות את הדבר הבא. Console color, color, ולתת לו איזשהו ערך דיפולט. לדוגמה, את אותו גריי שמקודם נתנו. ואת ה-Times, לתת לו איזשהו ערך דיפולט.
לדוגמה, את ה-1 שמקודם נתנו. ושימו לב שזה עובד אותו הדבר. נריץ, והופה, חסכנו לכתוב את הפונקציות. אז מה בעצם קרה כאן? מה שאמרנו פה זה דבר כזה: הנה פונקציה, אנחנו יכולים לתת לה מסג', אבל אנחנו לא חייבים לתת לה color ואנחנו לא חייבים לתת לה int times.
אם אנחנו לא נותנים, אלה ערכי בריאת המחדל. כאשר אנחנו באים לפתוח ולהשתמש בפונקציה אנחנו לא רואים דפדוף של מספר פונקציות, ערכי הברירת מחדל תמיד עוטפים אותם בסוגריים מרובעים.
סוגריים מרובעים גם בשפות אחרות בטול טיפ מציין שזה ערך ברירת מחדל ואנחנו לא חייבים לשלוח. האם אנחנו אבל יכולים להפעיל את הפונקציה בצורה כזאת?
אז כמובן שמסאג' אין לו ערך ברירת מחדל ולכן אנחנו לא יכולים. אנחנו חייבים לספק לו לפחות את המסאג' ואפשר לראות את זה גם כאן שהמסאג' לא עטוף בסוגריים מרובעים.
אם היינו באים ואומרים את המסאג' גם אני יכול לתת ובואו ניתן פה נניח סתם איזה דיפולט כזה. אז עכשיו אנחנו רואים שאנחנו כן יכולים לבצע קריאה כזאת.
גם סטרינג מסאג' עטוף בסוגריים מרובעים ואפילו אומרים לנו מהו ערך ברירת מחדל. בואו נריץ את זה בצורה כזאת ונראה שיש לנו את השלושה קווים מודפסים.
דבר מעניין שחשוב לציין בנוגע ל-Optional Parameters ושהפרמטרים האופציונליים חייבים להיות אחרונים. זאת אומרת, אתם לא יכולים ללכת איפשהו באמצע לדוגמה ולרשום פה עוד איזשהו פרמטר שהוא בעצם אין לו ערך ברירת מחדל כאשר לפניו יש מישהו עם ברירת מחדל.
אנחנו כמובן לא יכולים לעשות את זה כאן, אנחנו לא יכולים לעשות את זה בסוף. שימו לב שגם כאן יש לנו שגיאה על הדבר הזה. השגיאה אומרת לנו optional parameters, must appear after all required parameters אם היינו שמים את הערך הדרוש הזה בהתחלה כערך ראשון או מספר ערכים כאלה כמובן לא הייתה לנו שום בעיה מבחינת בניית הפונקציה היינו כמובן צריכים לספק אותו כאשר אנחנו קוראים
לפונקציה אז שימו לב שאלו הערכים שחייבים להופיע האחרונים אז כעת יש לנו את היכולת במקום לבצע העמסה של פונקציות אם הפונקציות הן מאוד מאוד מאוד דומות לבצע פשוט פונקציה אחת ולתת ערכי בריאת מחדל או ערכים אופציונליים מה שנקרא לפרמטרים של הפונקציה ואז לא חייבים לשלוח אותם.
הדבר הבא שקיים לנו נקרא Named Parameters. לצורך כך אני פשוט אעתיק את כל הדוגמה הזאת ואני אעבור לדוגמה של ה-Named Parameters, נדביק, נוריד רגע את ה-Default כדי שלא בטעות נחשוב שזה קשור לדיפולט.
יש לנו ConsoleColor זה הדיפולט, יש לנו Times שווה 1 זה הדיפולט. וכמובן כל הקריאות האלה כמובן יהיו לנו איזושהי בעיה איתן אז אני כרגע אשים אותן בהערה רק בכדי להדגים מה זה Named Parameters.
אוקיי נריץ את זה נראה שכרגע הוא מציג לנו את זה באדום ארבע פעמים הכל עובד כמו שצריך. מה זה Named Parameters? Named Parameters אומר שאנחנו יכלנו לקרוא לפונקציה בואו נקרא פה קריאה נופפת לפרינט ולומר כזה דבר פונקציה מקבלת Message אבל אנחנו יכולים לשלוח קודם כל את ה-Color איך?
פשוט רושמים את השם האמיתי של המשתנה שנמצא בפונקציה בשם המלא שלו נקודותיים זאת הסיבה שתמיד אתם בעצם רואים כאן את הנקודותיים כשאנחנו מתחילים לכתוב מיד אנחנו רואים את הנקודותיים האלה ולתת את הערך שאנחנו רוצים.
בואו ניתן כאן yellow. לאחר מכן בואו ניתן לדוגמה את ה-Times אז פשוט אנחנו רושמים Times נקודותיים ונותנים את ה-Times 3 ולבסוף Message נקודותיים ונותנים את ה-Message.
היי. נריץ ונראה שזה עובד פרפקט אפילו ששלחנו את זה בסדר שונה הכל נכנס כמו שצריך. אם ננסה להוריד את זה ולרשום פה רק שלוש, אז אנחנו רואים שהוא לא מסכים לקבל את זה, נחזיר את זה בחזרה.
בואו ננסה לעשות קריאה נוספת, פרינט. את המסאג' כן נשלח ראשון, This is my message, ואז נחליף רק בין השתיים האחרים. ניקח פה times, נקודותיים חמש, ויש לנו פה את ה-color, נקודותיים גלו, נריץ, ונראה שזה עובד מפני שהמסאג' נמצאת בדיוק במקום שלה.
אז יש לנו פה יכולת פשוט לקרוא לפרמטר בשם שלו עם נקודותיים ולהחליט לשלוח אותו בסדר אחר מהסדר שבו אנחנו רגילים לקרוא. איפה הדבר הזה שימושי? למה לי בעצם לשנות סדר של פרמטרים?
אז למעשה ברוב רוב המקרים אני לא ארצה לשנות סדר של פרמטרים כי זה הסדר שהפונקציה מקבלת אז מה אכפת לי פשוט לקרוא בסדר שהיא מקבלת.
יש פה איזשהו יתרון שאם מישהו מסתכל רק על הקריאה והוא לא מסתכל על הפונקציה כי הפונקציה נמצאת באיזשהו אזור אחר אז הוא יכול להבין אה בעצם זה הקצבה והשלוש הזה זה מספר הפעמים שאנחנו רוצים להדפיס אה אוקיי אז אני בעצם בבת אחת במבט אחד יכול לראות את השם של הפרמטר הנה פה לדוגמה אם הייתי רואה רק את זה לא הייתי יודע שארבע זה מספר הפעמים.
במבט חטוף אחד אלא אם כן אני הולך לפונקציה ופה אני כן רואה את השם אבל בדרך כלל לא עושים את זה כמעט תמיד אתם לא תראו שזאת הסיבה היחידה שבגללה אנחנו נבצע את ה-named parameters אז איפה כן משתמשים עם זה?
משתמשים עם זה כאשר יש לנו optional parameters שלא כל הפרמטרים הם אופציונליים או שכל הפרמטרים הם אופציונליים אבל אני רוצה חלק מהם להשאיר וחלק לשלוח.
איך עושים את זה? אז כעת אנחנו יכולים להחזיר בחזרה את הפרמטרים הקודמים שהיו. הנה ה-Default Message, הנה ה-Default Color שהיה Gray, והנה ה-Default Times שהיה 1.
וכעת, אם אני פשוט אריץ את זה כבר, אני יכול לראות שזה אמור לעבוד כמו שצריך, הכל בסדר, אבל בואו רגע נתחיל לקרוא לפונקציות הקודמות.
הפונקציות הקודמות עובדות גם כן כמו שאני רואה כי לכולם יש default parameters, נריץ את זה, הכל עובד כמו שצריך.
אוקיי, מה קורה אם אני בעצם רוצה לשלוח רק message ו-times? למה? כי צבע, אני רוצה להשאיר בצבע ה-default שלו.
אז אם זה המצב, אז אני רוצה לבצע פה איזושהי קריאה לפרינט ולשלוח message, לטיימס אני יכול להחליף את המקום שלהם כי אפילו שהמערכת אומרת לי שצריך להכניס קולור אני יכול להתעלם מזה טיימס לדוגמה 10 ולא לשלוח את הקולור בכלל דילגתי עליו אבל בייסיקלי מה זאת אומרת דילגתי עליו לא שלחתי את ערכו
כי ערכו יש אותו כברירת מחדל אלא אמרתי שאני רוצה לשלוח 10 ישירות לטיימס בואו נריץ נראה באפור 10 פעמים this is my message אפשרות נוספת הייתה אם המסאג' לא היה מוגדר.
אם המסאג' לא מוגדר, אני בעסיקלי חייב לשלוח אותו. פה כמובן כבר הולכת להיות לנו איזושהי בעיה. בואו כן נחזיר את המסאג' כדי לראות משהו קצת יותר אמיתי שמשתמשים איתו בתעשייה.
בואו נניח שהייתי רוצה להשאיר את המסאג' כמו שהוא, והייתי רוצה לדלג מעל דברים אחרים. נניח בואו נעשה כזה דבר. נשלח אך ורק את הקולור.
איך אנחנו שולחים אך ורק את הקולור? הרי המסאג' אומר לנו תביא לנו בבקשה את הערך. אוקיי, אני לא רוצה, אין בעיה, יש לו דיפולט. אז אני פונה לקולור בנקודותיים ופונה לתורקיז.
אחד נשאר דיפולט, מסאג' נשאר דיפולט, אני מריץ ואני רואה שיש לי פה בסוף את השלושה קווים the turkeys. זאת אומרת יש לנו יכולת עכשיו לדלג מעל פרמטרים על ידי הקונספט של הניימד פרמטר ולהגיד בדיוק את מי אנחנו שולחים לאן.
הכלי הבא זאת המילה השמורה דיינמיק. דיינמיק, אני רואה שהניימספייס שלי מוגדר כדיינמיק. בואו נשנה לו את השם ל-NS ופשוט נוכל לפיכך להשתמש במילה דיינמיק.
דיינמיק זה בעצם טיפוס נתונים מאוד מיוחד. אנחנו יכולים לפתוח איתו משתנה מיי אובג'קט וכמובן אנחנו יכולים להכניס אליו איזה שהוא ערך אני כרגע לצורך הדוגמה אצור כאן קלאס פרודקט יש לי פה מחלקה פרודקט אין בה שום דבר אז