Presentation is loading. Please wait.

Presentation is loading. Please wait.

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

Similar presentations


Presentation on theme: "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים"— Presentation transcript:

1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פרק 6 הפניות ועצמים מורכבים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מה בשיעור? משתנה מטיפוס מחלקה מערך של עצמים עצם מורכב עצם מורכב המייצג אוסף העתקה עצם שתכונתו מטיפוס עצמו מחרוזת – עצם קבוע אספן זבל © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

3 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא כאשר נוצר עצם, מוקצה לו שטח בזיכרון. כתובת העצם בזיכרון נקראת הפניה (reference). השימוש העיקרי בהפניה הוא כדי להגיע אל העצם ולבקש ממנו לפעול. משתנה מטיפוס מחלקה מכיל את ההפניה לעצם ולא את העצם עצמו. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

4 אתחול של משתנה מטיפוס מחלקה
Bucket b1 = new Bucket (8); קודם מתבצעת יצירת העצם והקצאת משתנה מטיפוס המחלקה. לאחר מכן, מתבצעת השמת ההפניה לעצם, במשתנה b1. b1 Bucket capacity currentAmount 8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
השימוש בהפניה נניח שהשורה הבאה בקוד תהיה: b1.Fill (5); הנקודה אחרי שמו של המשתנה מתפרשת במערכת כהוראה לגשת אל העצם שההפניה מפנה אליו, ולהשתמש בו. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

6 אתחול על ידי הצבה של הפניות
נסתכל על שורות הקוד האלה: Bucket b1 = new Bucket (10); Bucket b2 = b1; בשורה הראשונה מוצבת במשתנה b1 הפניה למופע חדש של דלי. בשורה השנייה, מוגדר משתנה בשם b2, שאליו מועתקת ההפניה הקיימת ב-b1. כלומר כעת קיימות שתי הפניות לאותו העצם. b1 Bucket capacity currentAmount 10 b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

7 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
העתקת עצמים על מנת ליצור שני עצמים שונים בעלי אותם ערכי תכונות, יש להשתמש בפעולה בונה מעתיקה: Bucket b1 = new Bucket (10); Bucket b2 = new Bucket (b1); במקרה זה נוצר העתק נוסף של העצם אליו מפנה b1. b2 מפנה אל העצם החדש: b2 Bucket capacity currentAmount 10 b1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

8 אתחול על ידי null Bucket b1 = null; ניסיון לפנות אל עצם דרך משתנה
יגרום לשגיאה בזמן הריצה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

9 משתנה מטיפוס מחלקה שאינו מאותחל
Bucket b1; b1.Fill (5); מכיוון שהעצם לא אותחל, הקומפילציה תיעצר אנו נקבל שגיאת הידור © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

10 ? חשבו באיזה מקרה ההשוואה תסתיים בהדפסה השנייה.
השוואת הפניות נסתכל על קטע הקוד Bucket b1 = new Bucket (10); Bucket b2 = new Bucket (b1); if (b1 == b2) Console.WriteLine ("שני המשתנים מפנים לאותו עצם"); else Console.WriteLine ("שני המשתנים מפנים לשני עצמים שונים"); ההשוואה בודקת: האם שתי ההפניות פונות לאותו העצם במקרה שלפנינו ההדפסה תהיה: "שני המשתנים מפנים לשני עצמים שונים" ? חשבו באיזה מקרה ההשוואה תסתיים בהדפסה השנייה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

11 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? כתבו קטע קוד המחזיר: true אם b1 ו-b2 שווים בערכי תכונותיהם אחרת, הוא מחזיר false © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

12 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מערך של עצמים כדי ליצור מערך של חמש קופסאות, נכתוב: Box[] arr = new Box[5]; arr null 1 2 3 4 Box[] Length 5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

13 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
אתחול המערך arr [0] = new Box (1, 2, 5); arr [1] = new Box (3, 2, 1); arr [2] = new Box (2, 2.5, 2); arr 1 null 2 3 4 Box[] Length 5 Box length width height 2.5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

14 עצם מורכב כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי,
אנו קוראים לעצם הנוצר מהמחלקה עצם מורכב (composite object) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

15 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מערכת בית ספרית הנחה: קיים מאגר הורים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

16 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
המחלקה תלמיד © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

17 ייצוג המחלקה (מגדירה עצם מורכב)
public class Student { private string name; private string phoneNum; private Parent parent; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

18 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולה בונה public Student (string name, string phoneNum, Parent parent) { this.name = name; this.phoneNum = phoneNum; this.parent = parent; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

19 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
רישום התלמיד ההורה נרשם במאגר ההורים: Parent p1 = new Parent ("Katz Meir", " "); התלמיד נרשם : Student st1 = new Student ("Katz Oren", " ", p1); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

20 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הפעולה GetParent() public Parent GetParent() { return this.parent; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

21 שימוש בפעולה GetParent()
Parent p = st1.GetParent(); string parentName = p.GetName(); או בשורה אחת: string parentName = st1.GetParent().GetName(); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

22 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תכונה מטיפוס מחלקה עד כה ראינו את הקוד של המחלקה באופן כללי. עתה ננסה להבין, מה המשמעות של הקוד מבחינת ההתרחשות בזיכרון. נתמקד בתכונה מטיפוס מחלקה: © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

23 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולה בונה זימון: Parent p1 = new Parent ("Katz Meir", " "); Student st1 = new Student ("Katz Oren", " ", p1); גוף הפעולה: public Student (string name, string phoneNum, Parent parent) { ... this.parent = parent; } Parent name cellNum Student phoneNum parent st1 p1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

24 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הפניה כערך החזרה גוף הפעולה GetParent(): public Parent GetParent() { return this.parent; } שימוש בפעולה : Parent p1 = new Parent ("Katz Meir", " "); Student st1 = new Student ("Katz Oren", " ", p1); Parent p2 = st1.GetParent(); p2.SetCellNum (" "); ? ציירו תרשים עצמים המתאר את העצמים הקיימים בקטע הקוד המופיע למעלה ואת מצבם בסוף הקטע. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

25 הפניות שונות לאותו עצם – הפן החיובי
כאשר שני אחים (או יותר) לומדים באותו בית ספר, אזי התכונה parent שלהם תצביע לאותו הורה. (מדוע ?) אם נרצה לעדכן את הטלפון הסלולרי של ההורה, מספיק לעשות זאת דרך אחד האחים. העדכון ישתקף אצל יתר האחים ( מדוע?) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

26 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סיכום ביניים משתנים שונים יכולים להחזיק הפניות לאותו עצם. שינוי שייעשה בעצם על ידי שימוש בהפניה שבאחד המשתנים ייראה אחר כך בכל אחת מההפניות האחרות. פרמטרים וערכי החזרה מטיפוס מחלקה הם למעשה הפניות. העברת עצם כפרמטר לפעולה, פירושה למעשה הצבת עותק של ההפניה לעצם, בפרמטר של הפעולה. החזרת עצם מפעולה, פירושה החזרת ההפניה אליו. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

27 עצם מורכב המייצג אוסף - StudentList
המחלקה מאפשרת: הוספת תלמיד לרשימה כיתתית. מחיקת תלמיד מהרשימה. קבלת פרטיו של תלמיד על פי שמו. הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. הנחה: יש מקום ברשימה הכיתתית. אין צורך לבדוק האם קיים מקום ברשימה לפני הכנסת תלמיד חדש. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

28 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ממשק המחלקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

29 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שימוש ב-StudentList StudentList studentList = new StudentList(); Student st1 = new Student ("Potter Harry"," ", p1); Student st2 = new Student ("Scofield Michael"," ", p2); // להלן הוספת שלושת התלמידים לרשימה הכיתתית: studentList.Add (st1); studentList.Add (st2); Console.WriteLine (studentList); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

30 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלות ? כתבו פעולה המקבלת רשימה כיתתית ושם של תלמיד, ומדפיסה את מספר הטלפון הסלולרי של ההורה האחראי על תלמיד זה. ? יותם, הבכור באחי משפחת כהן, התייצב במזכירות בית הספר ודיווח על שינוי מספר הטלפון הסלולרי של אביו. כיצד תבצע נטע המזכירה את העדכון? פרטו ונמקו בעזרת קוד או בעזרת תרשימי עצמים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

31 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ייצוג של StudentList לפי כללי בית ספר אין אפשרות שמספר התלמידים בכיתה יעלה על 35. public class StudentList { public const int MAX_STUDENTS = 35; private Student[] list; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

32 הפעולה הבונה של StudentList
public StudentList () { this.list = new Student[MAX_STUDENTS]; } פעולה זו מייצרת מערך ריק (שבכל תאיו יש null ( על מנת לאתחל את התאים - יש להשתמש בפעולת ההוספה לרשימה כיתתית © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

33 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולת ההוספה ישנן שתי אפשרויות למציאת מקום ההוספה: לסרוק את המערך עד שמגיעים ל-null. להוסיף תכונה lastPosition. תכונה זו תשמור את האינדקס של המקום הפנוי הראשון ברשימה. אנו נשתמש באפשרות השנייה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

34 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולת ההוספה public class StudentList { public const int MAX_STUDENTS = 35; private Student[] list; private int lastPosition; public void Add (Student st) this.list[this.lastPosition] = st; this.lastPosition++; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

35 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלות ? כתבו את פעולת ההוספה ללא הגדרת התכונה lastPosition. נתחו את זמן הריצה של פעולת ההוספה עם התכונה ובלעדיה, ונסחו את מסקנותיכם. ? נניח כי הרשימה הכיתתית lst קיימת. במהלך תוכנית כלשהי, הוצבה במשתנה student1 הפניה לתלמיד ואז ביצעה התוכנית את הזימון הזה: lst.Insert (student1); א. התבוננו בפקודה זו: this.list [this.lastPosition] = st; כמה הפניות אל התלמיד החדש קיימות לפני ביצוע שורת הקוד הבאה שבגוף פעולת ההוספה, וכמה קיימות אחריה. הסבירו את תשובתכם בפירוט. ב. כמה הפניות לתלמיד יישארו עם תום פעולת ההוספה? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

36 תכונה המציינת את המקום הפנוי הראשון
פעולת המחיקה (הוצאה) public Student Del (string name) { Student st = null; int i = 0; while (i < this.lastPosition && this.list[i].GetName().CompareTo (name) != 0) i++; if (i < this.lastPosition) st = this.list[i]; for (int k = i+1; k < this.lastPosition; k++) this.list[k-1] = this.list[k]; this.lastPosition--; this.list[this.lastPosition] = null; } return st; תכונה המציינת את המקום הפנוי הראשון סגירת "חור" במערך © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

37 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הפעולה ToString() בפעולת ההוספה שראינו, כל תלמיד הוכנס למקום הפנוי הראשון. הפעולה ToString() אמורה להחזיר מחרוזת המתארת את הרשימה באופן ממוין. מיון היא פעולה יקרה. האם יש אפשרות להימנע ממיון הרשימה בביצוע הפעולה ToString()? תשובה: אפשר, אם נוודא שהמערך המייצג את הרשימה הכיתתית נשמר ממוין כל הזמן. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

38 פעולת הוספה השומרת על המיון
נשמור על הייצוג הקיים. האלגוריתם של פעולת ההוספה השומרת על המיון של המערך ייראה כך: סרוק את המערך מתחילתו. כל עוד שם התלמיד החדש גדול (לפי סדר אלפביתי) משם התלמיד במקום הנוכחי – התקדם למקום הבא במערך. הזז ימינה (מקום אחד) את כל איברי המערך מהמקום הנוכחי עד סוף המערך (כדי ליצור מקום במערך שלתוכו ניתן יהיה להכניס את התלמיד החדש). הכנס את התלמיד החדש למקום שהתפנה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

39 פעולת הוספה השומרת על המיון
פעולת הוספה השומרת על המיון public void Add (Student student) { int i = 0; while (i < this.lastPosition && this.list[i].GetName().CompareTo (student.GetName()) < 0) i++; if (i < this.lastPosition) MoveOthers(i); this.list[i] = student; this.lastPosition++; } פעולת עזר. פעולה זו אחראית על הזזה ימינה של כל האיברים מהמקום i ועד סוף המערך © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

40 שאלות ? ממשו את הפעולה void MoveOthers (int place)
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

41 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
יעילות הפעולות המערך ממוין המערך אינו ממוין הפעולה ToString() O(n) O(nlogn) פעולת ההוספה O(1) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

42 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? מכיוון שהמערך ממוין עולה השאלה האם ניתן להיעזר בחיפוש בינרי ולהקטין את סדר הגודל של פעולת המחיקה ל-O(logn)? הסבירו ונמקו את תשובתכם. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

43 הערות לגבי הרשימה הכיתתית
עולם הבעיה אנו משתמשים בשם לצורך זיהוי ומניחים שאין שמות כפולים בעולם. ביישום אמיתי הזיהוי נעשה על ידי תעודת הזהות. (בעולם האמיתי קיימים אנשים בעלי אותו שם). במחלקה Student לא קיימת פעולה לשינוי שם. בדרך זו נשמרת ההנחה שאין בעולם וברשימה תלמידים בעלי אותו שם. בנוסף, ללא SetName(…) אפשר להבטיח שהרשימה נשארת ממוינת לאורך התוכנית. (אם היה אפשר לשנות את השם, יכול היה המשתמש להרוס את מיון הרשימה). מצב שבו יש יותר מהפניה אחת לעצם יכול להיות טוב ומתאים (למשל שינוי הטלפון של הורה דרך אחד האחים) או מסוכן. לכן יש צורך לשלוט במספר ההפניות הפונות לעצם. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

44 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
העתקה נניח כי קיים עצם מורכב a, שתכונתו היא הפניה לעצם אחר b. אנו רוצים ליצור עותק של a . לגבי העתקה של התכונה b קיימות שתי אפשרויות: 1. בעותק של a ליצור הפניה שתפנה ל-b. כך יהיו שתי הפניות לאותו עצם b. 2. בעותק של a ליצור עצם חדש c שהוא העתק של b. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

45 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
העתקה של StudentList אפשרות 1 : העתקה של הפניות public StudentList (StudentList stList) { this.list = new Student[MAX_STUDENTS]; for (int i=0; i<stList.lastPosition; i++) this.list[i] = stList.list[i]; this.lastPosition = stList.lastPosition; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

46 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
העתקה של StudentList אפשרות 2 : העתקה של עצמים public StudentList (StudentList stList) { this.list = new Student[MAX_STUDENTS]; for (int i=0; i<stList.lastPosition; i++) this.list[i] = new Student (stList.list[i]); this.lastPosition = stList.lastPosition; } פעולה בונה מעתיקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

47 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? כמובן שאם איננו רוצים שאחראי הטיול יעדכן את פרטי התלמידים, אנו גם לא מעוניינים לאפשר לו לעדכן את פרטי ההורים (דרך מופעי התלמידים). כיצד נמנע זאת? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

48 עצם שתכונתו מטיפוס עצמו
תכונתו של עצם יכולה להיות מטיפוס המחלקה שלו עצמו: אין פעולה המשנה את הצבע © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

49 מימוש הפעולות Get ו-Set
public Bead GetNextBead() { return this.nextBead; } public void SetNextBead (Bead nextBead) this.nextBead = nextBead; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

50 יצירת שרשרת – דרך ראשונה
ניצור שני חרוזים בודדים בעזרת הפעולה הבונה המתאימה: Bead b1 = new Bead ("red"); Bead b2 = new Bead (“green"); עתה נחרוז את החרוזים לשרשרת: b2.SetNext (b1); Bead color nextBead "red" null b1 "green" b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

51 יצירת שרשרת – דרכים נוספות
דרך 2 : Bead b1 = new Bead ("red"); Bead b2 = new Bead ("green", b1); דרך 3: Bead b2 = new Bead ("green", new Bead ("red")); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

52 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
יצירת שרשרת מעגלית Bead b1 = new Bead ("red"); Bead b2 = new Bead ("blue", b1); Bead b3 = new Bead ("gray", b2); Bead b4 = new Bead ("green", b3); b1.SetNext (b4); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

53 משתנה מטיפוס מחלקה המשמש לסריקה
ניתן לסרוק את השרשרת באמצעות הפניה מטיפוס Bead: קיימת השרשרת הבאה: נגדיר משתנה שיפנה לחרוז הראשון ונקדם אותו: Bead p = b4; p = p.GetNextBead(); p p b4 Bead color nextBead "red" null b1 "gray" b3 "green" "blue" b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

54 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלות ? כתבו קטעי קוד עבור שרשרות החרוזים המתוארות להלן: א. הרכיבו שתי מחרוזות שונות, הזהות הן בצבעי החרוזים והן בסדר הופעת הצבעים במחרוזת. כל מחרוזת תהיה מורכבת מחמישה חרוזים, שצבעיהם (משמאל לימין) הם: ירוק, צהוב, אדום, ירוק, צהוב. המשתנים b1 ו-b2 יכילו הפניות לחרוזים הראשונים שבשתי המחרוזות. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

55 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלות ב. חברו את שתי המחרוזות שיצרתם על ידי שינוי הפניה במחרוזת השנייה, כך שיתקבל מבנה כמתואר באיור הבא. (שימו לב שאחרי ביצוע המשימה, אין בתוכניתכם אף הפניה לשלושת החרוזים האחרונים שבמחרוזת השנייה). ג. הרכיבו מחרוזת ארוכה המורכבת משתי המחרוזות המקוריות (מסעיף א), הראשונה תחילה ואחריה השנייה, וסגרו אותה למעגל. b1 Bead color nextBead "yellow" "green" b2 "red" null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

56 שרשור היררכי – Employee
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

57 שרשור היררכי – Employee
יצירת מבנה ארגוני: public static void Main(string[] args) { Employee emp1 = new Employee("Moshe", null); Employee emp2 = new Employee("Sara", emp1); Employee emp3 = new Employee("Yossi", emp1); Employee emp4 = new Employee("Yoram", emp1); Employee emp5 = new Employee("Yair", emp2); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

58 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
התוצאה Employee name supervisor "Yair" emp5 "Sara" emp2 "Yossi" emp3 "Yoram" emp4 "Moshe" null emp1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

59 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מחרוזת – עצם קבוע מחרוזות אינן ניתנות לשינוי (immutable). כל שינוי של מחרוזת יוצר מחרוזת חדשה המכילה את השינוי הרצוי. למשל אם קיימת מחרוזת: string str1 = "Moshe"; ונרצה לשרשר לה שם משפחה כהן: str1+= “Cohen”; יווצר מקום חדש בזיכרון שתוכנו “Moshe Cohen”, ותוכן המקום הקודם לא ישתנה ויהיה עדיין “Moshe”. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

60 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מחרוזת – עצם קבוע מדוע ישנה חשיבות לכך שהמחרוזת אינה משתנה? כיוון שכאשר משתמשים במחרוזות, אין סכנה במספר הפניות שפונות לעצם אחד. נבחן את הקוד הבא: string str1 = "Moshe"; string str2 = str1; str1 += " Cohen"; Console.WriteLine (str1 + ", " + str2); הפלט שיתקבל יהיה: Moshe Cohen, Moshe . חשבו מדוע ? כאשר עובדים עם מחרוזות, ניתן להתייחס אליהן כאל טיפוס בסיסי ולא להיות מוטרדים ממספר הפניות הפונות לאותו העצם. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

61 אספן זבל בסישרפ קיים מנגנון מיוחד בשם אספן זבל (garbage collector).
אספן הזבל דואג למחוק מהזיכרון עצמים שאין אף משתנה הפונה אליהם. לדוגמה, אם לאחר ההקצאה: Bucket b1 = new Bucket(10); מציבים: b1 = null; ההפניה היחידה מהתוכנית אל המופע של הדלי נמחקה מנגנון איסוף הזבל ישחרר את העצםb1 מהזיכרון. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

62 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סוף © המרכז להוראת המדעים האוניברסיטה העברית בירושלים


Download ppt "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים"

Similar presentations


Ads by Google