DCSIMG
שאלה בפורום תפוז: Properties ב - .NET - Ohad Aston - ASP.NET Blog

Ohad Aston - ASP.NET Blog

פיתוח לאינטרנט, ASP.NET ועוד

על הבלוג

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

Try Opera today - it's free

Ohad Aston's Facebook profile

Pagerank - קידום בגוגל

website counter

Powered by TinyMCE
Add to Technorati Favorites
Add to Google

אני ב - Twitter

    הבלוגספירה

    עצומות חשובות - חתמו והשפיעו!

    פרוייקטים ששווים הצצה

    שאלה בפורום תפוז: Properties ב - .NET

    השאלה:

    יש לי את הקוד הבא בקלאס כל שהוא:

    private float _thickness;
    
    internal float _Thickness
    {
        get
        {
            return _thickness;
        }
        set
        {
             _thickness = value;
        }
    }

    השאלה שלי  היא מה ההבדל בין _thickness לבין _Thickness?

    אחד מהעקרונות ב - OOP (ר"ת של Object Oriented Programing) הוא Encapsulation (בעברית יכול להקרא גם "כימוס").

    נניח שאתה יוצר Class כלשהו שיש לו התנהגות מסויימת, מבחינת המפתח שמשתמש בו, הקלאס (להלן "המחלקה") היא קופסה שחורה שעושה משהו. (לדוגמה המחלקה Random מחזירה מספר רנדומלי. מבחינתך זה לא משנה איך).

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

    בכדי לחשוף את ה - thickness למפתח (נניח שאתה מעוניין לתת לו לראות מה הערך אך לא לשנות אותו), היה נהוג להשתמש במתודות שנקראות get_Thickness, ובכדי לקבוע את הערך ב - set_Tickness.

    ה - set יכול לשמש גם לבדיקות (לדוגמה ה - thickness חייב להיות ערך חיובי, לכן לא תרצה שהמשתמש יוכל לגשת ל - thickness ולשים בו ערך שלילי). הפתרון לזה היה נראה כך (בלי Properties):

    internal sealed class MyClass
    {
        private float _thickness;
        
        public float get_Thickness()
        {
            return _thickness;
        }
        
        public void set_Thickness(float value)
        {
            if (value <= 0)
                throw new InvalidArgumentException("Thickness must be
    greater than 0!!!!11"
    ); _thickness = value; } }

    מיקרוסופט החליטו לתת פתרון למצב הזה (הקוד הזה מאוד מאוד נפוץ בתכנות OOPי), והציגו את ה -  Properties,
    הקוד עם Properties יראה כך:

    internal sealed class MyClass
    {
    
        private float _thickness;
        
        public float Thickness
        {
            get
            {
                return _thickness;
            }
            set
            {
                if (value <= 0)
                    throw new InvalidArgumentException("Thickness must be 
    greater than 0!!!!11"
    ); _thickness = value; } } }

    ל -get ול - set האלו קוראים Properties, (גם getter ו - setter)
    השימוש במחלקה יראה כך (בלי ועם Properties):

    // Sample code without properties
    MyClass mc = new MyClass();
    mc.set_Tickness(1.0);
    Console.WriteLine("{0}", mc.get_Tickness());
    
    // Sample code with properties:
    MyClass mc = new MyClass();
    mc.Thickness = 1.0;
    Console.WriteLine("{0}", mc.Thickness);

    בשורה תחתונה מדובר על אותה פונקציונליות, רק הקוד נראה יותר אסתטי, ודורש פחות כתיבה עם properties (ה - properties מתורגמים בסופו של דבר לפונקציות get_xxx ו - set_xxx דבר שה - CLR דואגת לו).

    דרך אגב Martin Fowler ו - Jeffrey Richter כתבו את דעתם והם לא ממש בעד העניין. מעניין לקרוא את דעתם.

    פורסם: Mar 03 2008, 10:17 PM by OhadAston | with 1 comment(s)
    תגים:, ,

    תוכן התגובה

    spiritus asper כתב/ה:

    רק תיקון קל, זה לא ה-CLR שהופך את ה properties לתוך פונקציות. אלא זה עוד קורה בשלב הקימפול הראשוני (לתוך CIL). לאחר השלב הזה, ניתן להבחין שאת ה properties מחליפות פונקציות get/set בהתאמה.

    # November 8, 2008 9:36 AM
    שלח תגובה

    (שדה חובה)  

    (שדה חובה)  

    (אופציונלי)

    (שדה חובה) 

    Please add 6 and 6 and type the answer here:


    Enter the numbers above: