בעיה בהצגת הID במתודת ToString
-
בחלון תצוגת התורמים השתמשתי בליסטבוקס כדי להציג את רשימת התורמים שהוזנה לתוכנית.
כדי להציג אותם מימשתי את מתודת ToString
הבעיה שלי היא שהמשתנה ID הוא סטטי (כדי שלכל תורם יהיה מס' סידורי אחר) ולכן כשהליסט מציג לי את הרשימה במקום להציג לי את הערך ID האמיתי של העצם, הוא מציג לי את הערך הנוכחי של המשתנה הסטטי (לדוגמ' 5). ניסיתי לשנות זאת ולהשתמש בthis.Id אך ללא הועיל.
זאת המתודה:public override string ToString() { string name = string.Format("ID: {0}, Name: {1} {2}, Tel: {3}, Adress: {4}, Email: {5}", this.Id, FirstName, LastName, Tel, Adress, Email); return name; }
תודה רבה מראש!!
פורסם במקור בפורום CODE613 ב06/07/2015 11:38 (+03:00)
-
הבעיה שלי היא שהמשתנה ID הוא סטטי (כדי שלכל תורם יהיה מס' סידורי אחר)
משתנה סטטי (ולמעשה אותו הדבר כל חבר סטטי כמו מאפיין מתודה וכו'), זה אומר שכל המופעים חולקים את אותו המשתנה! הוא לא אישי ופרטי לכל מופע אלא הוא משותף לכולם.
בעוד שמשתנה רגיל א. קיים רק אחרי שיוצרים מופע, ב. כל מופע יוצר אחד כמוהו נפרד, במשתנה סטטי המשתנה קיים ונגיש ללא יצירת מופע, ומאידך יצירת מופע לא משכפלת אותו ולמעשה הוא משתנה "גלובלי" שנגיש מכל מקום (פר אפליקציה, ובהתאם למציין הגישה שלו. אם זה פרטי אז רק מתוך המחלקה אבל לא משנה מאיזה מופע ולאו דוקא ממופע כמו במקרה של מתודה סטטית ואופרטורים).
כיון שID אמור לייצג מופע ולא לייצג את המחלקה ממנו המופע נוצר, אי אפשר שהוא יהיה סטטי, ובעצם מה שקורה כעת הוא שכשאתה מציב בID את המספר הבא - כל המופעים יחזירו את אותו המספר (בכלל בC# א"א לכתוב שם של מופע נקודה חבר סטטי אלא שם מחלקה נקודה חבר סטטי, ולכן this.ID אמור להוציא לך שגיאת זמן קמפול).זה נכון שבשביל לעקוב אחרי מופעים אחרים של אותו אובייקט זה נוח להשתמש באוסף/משתנה סטטי. אתה יכול לכתוב משתנה בשם CurrentNumber שיהיה סטטי (ויקבל בCounstactor ++ כל פעם) שיכיל את המספר להשמה בID (שלא יהיה סטטי!) הבא. אתה גם יכול לעשות List<> סטטית שתכיל את כל המופעים, ואז תוכל לדעת עוד פרטים על כל המופעים שנוצרו ואף לגשת אליהם מכל מופע ומופע.
הנה דוגמה:
class ClassWithAutoNumber { public ClassWithAutoNumber() { ID = currNumber++; } private static int currNumber; // static. its one variable shared betwwen all instances public int ID { get; set; } //not static!!! its individual created for each instance }
פורסם במקור בפורום CODE613 ב06/07/2015 12:30 (+03:00)
-
אתה צודק ואני יודע זאת
לכן כתבתי כך:public abstract class Person { public static int id = 0; public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Tel { get; set; } public string Email { get; set; } public Person() { this.Id = id; ++id; }
כלומר המשתנה id הוא סטטי, אך המאפיין Id (עם I גדולה) הוא לא סטטי, לכן התכנית לא נותנת לי שגיאה כשאני מציב this.Id, כמו כן, בליסט שלי הוא שומר לכל עצם Id אחר.
לכן אני לא מבין מדוע כשאני קורא למתודה tostring על כל הליסט, ובליסט לכל עצם יש Id אחר משלו, הוא לא מציג לי את הid שלו, אלא נותן לי את הערך של הid הסטטי למרות שאני משתמש במשתנה Id עם I גדולה..
אתם צודקים שהיה יותר חכם להשתמש בשם שונה למשתנה הסטטי ולIDפורסם במקור בפורום CODE613 ב06/07/2015 13:21 (+03:00)
-
אתה צודק ואני יודע זאת
לכן כתבתי כך:אם ככה היה כתוב לך בקוד מלכתחילה ניסוח שאלתך מעורפל, מנין לנו לדעת שיש שתי ID??
ובכל אופן התעלומה ממש גדולה אם ככה. כי Id וid זה שתי שמות לכל דבר בC# ולא צריך שום this להבחנה ביניהם (מלבד הבחנה של קריאות). ולא התעצלתי והעתקתי את הקוד שלך ואצלי עובד פרפקט. מה הפשט?
פורסם במקור בפורום CODE613 ב06/07/2015 14:16 (+03:00)
-
טעות שלי!! סליחה שהטרדתי אתכם לשווא..
בתחילה כתבתי את הקוד ככה:string name = string.Format("ID: {0:5}, Name: {1} {2:5}, Tel: {3:5}, Adress: {4:5}, Email: {5:5}", this.Id, FirstName, LastName, Tel, Adress, Email); return name;
חשבתי שזה יתן מרווח של 5 תווים בין הנתונים.. אבל זה לא עבד, וכנראה זה מה שגרם את השינוי של הערך של הID ל5 (כיון שרק הוא היה מסוג INT ).
אח"כ מחקתי אותם ושכחתי למחוק את זה מהID ולכן זה עשה ככה (למרות שאין לי מושג מה זה אומר..)
דוד ל.ט. סליחה על הטרחה לשווא
ואת המרווח כנראה עושים עם פסיק, נכון?פורסם במקור בפורום CODE613 ב06/07/2015 14:36 (+03:00)
-
דוד ל.ט. סליחה על הטרחה לשווא
שום לשווא. כיף כל פעם.
ואת המרווח כנראה עושים עם פסיק, נכון?
כן. מה שאחרי הנקודתיים זה כמו מה שכותבים בסוגריים של הToString, שזה פורמט (מטבע, תאריך, מותאם אישית) שם אם תכתוב סתם מספר זה פשוט מחליף את הערך במפר הזה.
פורסם במקור בפורום CODE613 ב06/07/2015 15:04 (+03:00)