תרגיל - גלה סוגי הפניה
- 8 דקות
סוגי ההפניות כוללים מערכים, מחלקות המחרוזות. סוגי הפניות מטופלים בצורה שונה מסוגי ערכים בנוגע לאאופן שבו ערכים מאוחסנים כאשר היישום מבצע.
בתרגיל זה, תלמד כיצד סוגי הפניות שונים מסוגי ערכים, new וכיצד להשתמש באופרטור כדי לשייך משתנה לערך בזיכרון המחשב.
האופן בו סוגי הפניות שונים מסוגי ערכים
משתנה סוג ערך מאחסן את הערכים שלו ישירות באזור אחסון שנקרא הערימה. הערימה היא זיכרון המוקצה לקוד הפועל כעת ב- CPU (המכונה גם מסגרת הערימה או מסגרת ההפעלה). לאחר סיום ביצוע מסגרת הערימה, הערכים בערימה מוסרים.
משתנה מסוג הפניה מאחסן את הערכים שלו באזור זיכרון נפרד שנקרא 'העריפת'. הסם הוא אזור זיכרון המשותף ביישומים רבים הפועלים במערכת ההפעלה בו-זמנית. .NET Runtime מקיים תקשורת עם מערכת ההפעלה כדי לקבוע אילו כתובות זיכרון זמינות ומבקשות כתובת שבה היא יכולה לאחסן את הערך. .NET Runtime מאחסן את הערך ולאחר מכן מחזיר את כתובת הזיכרון למשתנה. כאשר הקוד שלך משתמש במשתנה, .NET Runtime מחפש בצורה חלקה את הכתובת המאוחסנת במשתנה, ואחזר את הערך המאוחסן שם.
בשלב הבא תכתוב קוד שממחיש רעיונות אלה בצורה ברורה יותר.
הגדרת משתנה סוג הפניה
מחק או השתמש באופרטור הוספת
//כדי להוסיף הערות לכל הקוד מהתרגילים הקודמים.עדכן את הקוד שלך בעורך קוד Visual Studio באופן הבא:
int[] data;הקוד הקודם מגדיר משתנה שעשוי לחזק ערך מסוג מערך
int.בשלב זה,
dataהוא רק משתנה שיכול להכיל הפניה, או במקום זאת, כתובת זיכרון של ערך בערם. מאחר שהיא אינה מצביעה על כתובת זיכרון, היא נקראת הפניה Null.יצירת מופע של מערך
intבאמצעות מילתnewהמפתחעדכן את הקוד שלך בעורך הקוד של Visual Studio כדי ליצור ולהקצות מופע חדש של
intמערך, באמצעות הקוד הבא:int[] data; data = new int[3];מילת
newהמפתח מודיעה ל- .NET Runtimeintליצור מופע של מערך ולאחר מכן מתואמת למערכת ההפעלה כדי לאחסן את המערך בגודלו עבור שלושה ערכי Int בזיכרון. .NET Runtime תואם ומחזיר כתובת זיכרון של המערךintהחדש. לבסוף, כתובת הזיכרון מאוחסנת בנתונים המשתנים. רכיביintהמערך מוגדרים כברירת מחדל לערך0, מכיוון שזהו ערך ברירת המחדל שלint.שנה את דוגמת הקוד כדי לבצע את שתי הפעולות בשורת קוד בודדת
שתי שורות הקוד בשלב הקודם מקצרות בדרך כלל לשורת קוד אחת כדי להצהיר על המשתנה וליצור מופע חדש של המערך
int. שנה את הקוד משלב 3 לשלב הבא.int[] data = new int[3];למרות שאין פלט לצפות, אנו מקווים שתרגיל זה הוסיף בהירות לאופן בו התחביר של C# מתייחס לשלבים בתהליך לעבודה עם סוגי הפניה.
מה שונה בסוג הנתונים של מחרוזת C#?
סוג string הנתונים הוא גם סוג הפניה. ייתכן שאתה תוהה מדוע לא נעשה new שימוש באופרטור בעת הצהרה על מחרוזת. זוהי רק נוחות המנוה לך על ידי מעצבים של C#. מאחר שסוג string הנתונים נמצא בשימוש תכוף כל כך, באפשרותך להשתמש בתבנית זו:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
עם זאת, מאחורי הקלעים נוצר מופע חדש של System.String Hello World!".
חששות מעשיים בשימוש בסוגי ערכים והפפניות
-
סוג ערך (int): בדוגמה זו,
val_Aשהםval_Bסוגי ערכים שלמים.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
אתה אמור לראות את הפלט הבא:
--Value Types--
val_A: 2
val_B: 5
כאשר val_B = val_A מתבצעת, הערך של מועתק val_A ו מאוחסן ב- val_B. לכן, כאשר val_B משתנים, val_A נשארים לא מושפעים.
-
סוג הפניה (מערך): בדוגמה זו, הם סוגי
ref_Aהפניותref_Bלמערך.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
אתה אמור לראות את הפלט הבא:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
כאשר ref_B = ref_A מתבצעת פעולה, ref_B מצביע על אותו מיקום זיכרון כמו ref_A. לכן, בעת ref_B[0] שינוי, משתנה ref_A[0] גם מכיוון ששתן מצביעות על אותו מיקום זיכרון. זהו הבדל מרכזי בין סוגי ערכים וסוגי הפניות.
תקציר
- סוגי ערכים יכולים לאחסן ערכים קטנים יותר ולאחסן אותם בערימה. סוגי הפניות יכולים ל מכילים ערכים גדולים, ומופע חדש של סוג הפניה נוצר באמצעות האופרטור
new. משתני סוג הפניה מחזיקים הפניה (כתובת הזיכרון) לערך הממשי המאוחסן בזיכרון. - סוגי ההפניות כוללים מערכים, מחרוזות ומחלקות.