
Nullable<int>, או בקיצור int?.HasValue בודקים אם יש ערך, ו-Value מחזיר את הערך עצמו מסוג int רגיל. הגישה ל-Value כשאין ערך גורמת לשגיאה.int? ו-DateTime? הם הצורה הנפוצה, והקומפיילר מתייחס אליהם כ-Nullable.הטקסט המלא של הדקות הראשונות בהרצאה «Generics - חלק 7» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר האחרון שאנחנו הולכים לראות בנוגע לעולם הג'נרי זה משהו מאוד מעניין שיצרו אותו כפתרון לאיזושהי בעיה שהייתה שקשורה לדאטה בייסינג וזה נקרא נלאבל טייפס. בואו נבין מה בדיוק הייתה הבעיה ומה הפתרון שלה.
בואו ניקח פרויקט חדש ובואו ניקח פה איזושהי פונקציה שאמורה להחזיר איזשהו אינטג'ר ונקרא לה get age היא מקבלת בוא נניח int userid ומוכרע להחזיר את הגיל שלו. בוא נניח שבדאטאבייס יש איזשהו משתנה גיל שמתאר את הגיל של איזשהו משתמש.
אבל יש משהו בדאטאבייסים שלא היה קיים כל כך בתכנות לפחות בדוטנט ומה שהיה בדאטאבייסים קיים זה שפשוט מאוד יכולה להיות לנו איזושהי עמודה בתוך מסד נתונים שנקראת עלאונל. כלומר ניתן לא להכניס דבר לעמודה הזאת.
אם לא מחליפים דבר לעמודה לשדה הזה אז זה אומר שיש בתוכו נאל. אבל אם העמודה מוגדרת כאינטג'ר אז יכול להיות מצב שבדאטאבייס יש לה איזשהו ערך ויכול להיות מצב שבדאטאבייס אין לה איזשהו ערך אבל בדוטנט לא יכול להיות מצב שיהיה לנו משתנה h שמחזיק נאל.
אם אני מסתכל כרגע על הקוד הזה אני רואה שבכלל יש לי פה שגיאת קומפילציה. אנחנו לא יכולים להכניס null לתוך int כי value type לא יכול לקבל null לעולם כי null בעצם זה הטובת 0 כלומר פוינטר או רפרנס שלא מצביע על אף אובייקט אבל value type בכלל לא מצביע על אובייקט אם זה לא רפרנס אז value type לא יכול לקבל
null וכאן נוצרה איזושהי בעיה כאשר הייתה לנו איזושהי פונקציה שאמורה להחזיר איזשהו ערך value type לא reference type כי reference type אין בעיה להחזיר נל value type שניגש לדאטאבייס ומביא את אותו ערך יכול להיות שהדאטאבייס אומר תקשיב אין לי אין לי ערך כזה תחזיר נל אבל לא היינו יכולים להחזיר את הנל
הזה מ-C-Sharp מה הפתרון שיצרו מה שיצרו זה פשוט מאוד סטראקט שנקרא נלבל יכול לקבל כל טיפוס נתונים בלבד שיהיה ועובר על U-type, שימו לב את העילות הזה where t.2 abstract אז בואו ניתן לו int ואז הטיפוס נתונים הזה כן יוכל להחזיק null בתוכו.
איך אנחנו בדיוק עובדים איתו? בואו נוכל כרגע פשוט להחזיר מהפונקציה את ה-h הזה כאשר הפונקציה מחזירה nullable של int. אז יכלנו להכניס בתוכו null, יכלנו להכניס בתוכו ערך אמיתי, בוא נגיד לא 1000 אם אנחנו מטפלים בגיל אבל בוא נניח 50 יכלנו להכניס לתוכו ויכלנו כרגע להחזיר את הטיפוס המוזר הזה שגם יכל לקבל ערכים אמיתיים מדאטאבייסים וגם יכל
לקבל null מדאטאבייסים. בואו ניקח את הדוגמה הזאת כדוגמה כללית. ניקח nullable של int ונקרא לו איזשהו num. אנחנו יכולים להכניס לתוך num ערך אמיתי ולהציג אותו, ושימו לב שכרגע הוא יציג לי את הערך שלו.
ה-2 סטרינג של הטיפוס הזה פשוט מביא לי את הערך האמיתי. אנחנו יכלנו להכניס לתוכו null, כאשר אם היינו מציגים אותו עכשיו, לא היינו רואים שום דבר כי null לא נראה על הקונסול, אבל אנחנו יכלנו לבצע בדיקה האם num שווה ל-null.
אם כן, בואו נציג נל אלס בואו נציג את נם במקום ההצגה הזאת ונראה שכרגע הוא אומר לנו שיש בתוכו נל.
אפשרות נוספת הייתה לבדוק האם נם נקודה as value האם יש לך ערך אם כן בואו נציג את הvalue עצמו ואנחנו יכולים להגיע לvalue על ידי נקודה value.
שימו לב שאם הגדרנו nullable של int אז הvalue שלו הוא מטיפוס int טהור. בואו נבדוק מה קורה כאן כרגע והוא כמובן יגיד לנו שערכו הוא null.
אנחנו יכולים שנייה לפני זה להכניס ל-num את הערך 123 ולראות שהוא פשוט מציג לנו 123 על המסך. דבר נוסף שאפשר לבצע זה פשוט לבנות ל-num נקודה getValueOrDefault getValueOrDefault זאת פונקציה שאומרת לנו שהיא מחזירה את ערכו של נ"מ במידה והוא לא נ"ל.
אם הוא נ"ל היא תחזיר לנו את ערך ה-Default שלו. בואו נריץ את זה ונראה שכעת הוא יחזיר לנו 1, 2, 3. אם נגדיר נ"ל בתוכו ונקרא ל-GetValueOrDefault היא תחזיר את ה-Default של אינטג'ר, שזה 0.
איך אנחנו יודעים מה ה-Default של אינטג'ר? יש לנו ב-.NET את ה-OperatorDefault. אם אנחנו נותנים לו לדוגמה int, אז אנחנו יכולים לראות שהוא יגיד לנו שה-Default של int 0. בואו נריץ, ה-Default של int זה 0.
בואו ננסה לראות דיפולט אחר, רק לצורך הדוגמה, ה-Default של DayTime יהיה משהו קצת מוזר, והיא התאריך הראשון לראשון שנת אחת, חצות. אוקיי, אז אם יש לנו פה איזשהו משתנה לדוגמה שהוא דייט טיים או נלאבל דייט טיים, נלאבל של דייט טיים ויש לו נל ואנחנו מציגים dt get value or default אז אנחנו כמובן מקבל את התאריך המוזר הזה כי זה הדיפולט של דייט