דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. בעיה בהצגת הID במתודת ToString

בעיה בהצגת הID במתודת ToString

מתוזמן נעוץ נעול הועבר ארכיון code613m
6 פוסטים 2 כותבים 494 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    בחלון תצוגת התורמים השתמשתי בליסטבוקס כדי להציג את רשימת התורמים שהוזנה לתוכנית.
    כדי להציג אותם מימשתי את מתודת 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)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      @avr416

      הבעיה שלי היא שהמשתנה 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)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      2
      • A מנותק
        A מנותק
        avr416
        כתב ב נערך לאחרונה על ידי
        #3

        אתה צודק ואני יודע זאת :smile:
        לכן כתבתי כך:

        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 :smile:

        פורסם במקור בפורום CODE613 ב06/07/2015 13:21 (+03:00)

        תגובה 1 תגובה אחרונה
        0
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          @avr416

          אתה צודק ואני יודע זאת :smile:
          לכן כתבתי כך:

          אם ככה היה כתוב לך בקוד מלכתחילה ניסוח שאלתך מעורפל, מנין לנו לדעת שיש שתי ID??

          ובכל אופן התעלומה ממש גדולה אם ככה. כי Id וid זה שתי שמות לכל דבר בC# ולא צריך שום this להבחנה ביניהם (מלבד הבחנה של קריאות). ולא התעצלתי והעתקתי את הקוד שלך ואצלי עובד פרפקט. מה הפשט?

          פורסם במקור בפורום CODE613 ב06/07/2015 14:16 (+03:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          0
          • A מנותק
            A מנותק
            avr416
            כתב ב נערך לאחרונה על ידי
            #5

            טעות שלי!! סליחה שהטרדתי אתכם לשווא..
            בתחילה כתבתי את הקוד ככה:

            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)

            תגובה 1 תגובה אחרונה
            0
            • dovidD מחובר
              dovidD מחובר
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              @avr416

              דוד ל.ט. סליחה על הטרחה לשווא 😢

              שום לשווא. כיף כל פעם.

              @avr416

              ואת המרווח כנראה עושים עם פסיק, נכון?

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

              פורסם במקור בפורום CODE613 ב06/07/2015 15:04 (+03:00)

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              1

              בא תתחבר לדף היומי!
              • התחברות

              • אין לך חשבון עדיין? הרשמה

              • התחברו או הירשמו כדי לחפש.
              • פוסט ראשון
                פוסט אחרון
              0
              • דף הבית
              • קטגוריות
              • פוסטים אחרונים
              • משתמשים
              • חיפוש
              • חוקי הפורום