כפרמטר באובייקטC# Struct.

30 בMarch 2013

תגיות:
אין תגובות

מהו Struct? ולמה אני צריך אותו?
השאלה המעניינת היא מי בכלל משתמש בו??

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

Struct
הוא אובייקט “מנוון” ?? ממש לא, צורת ההגדרה פשוט מזכירה שימוש
באובייקטים.

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

שפת c#  מלאה ב Structures בשימוש יום יומי בלי שאנו בכלל שמים לב..

לדוגמא:

System.Windows.Media.COLOR;

System.Windows POINT;
System.INT32

 חשוב להבין ש Struct הוא Value Type ולא Reference  Type כמו אובייקט.

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

struct TestStruct

    {

        public int value;

    }

    class Test

    {

        TestStruct vStruct;

 

        public TestStruct My_va

        {

            get { return vStruct; }

            set { vStruct = value; }

        }

 

        public Test()

        {

            vStruct.value = 10;

        }

    }

נניח
שנתון קוד כזה, אני יכול לעשות את הדבר הבא:

 Test tst= new Test();

            Console.WriteLine(tst.My_va.value);

ולא יכול
לעשות את הדבר הבא:

 Test tst= new Test();
            Console.WriteLine(tst.My_va.value);
            tst.My_va.value = 4;

אם ננסה
נקבל את השגיאה:

Cannot modify the return value of  because it is not a variable

הוא לא
משתנה? אז מה הוא? מדוע אם השדה
My_va.value 
היה קלאס לא היתה הבעיה? ובכן
אובייקט מחזיק בתוכו את השדות שלו, ואם אני מחזיק אובייקט כפרמטר בתוך אובייקט אחר
אני עדיין יכול לגשת לשדות הפנימיים שלו כי כביכול הם עכשיו פרמטרים שלי. אבל,
Struct הוא לא אובייקט ולא יכול
להחזיק בתוכו שדות אלא הוא שדה ערך אחד שמצביע לכמה אחרים, ומאחר שנוצר ואני משתמש
בו אני רק מצביע לעותקים של הערך המקורי שהוגדר ב
struct ועכשיו כשנרצה לבצע
שינויים אנו בעצם לא פונים למקור אלא לעותק מה שמפיל אותנו לשגיאה שזה לא משתנה..למה
זה קורה? כי #
C לא מאפשר למשתנה ערך לקבל ערכים מתוך משתנה התייחסות (הפוך זה
אפשרי)

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

            tst.My_va = new TestStruct(){value = 6};     

 

 

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *