DCSIMG
C# 4.0 Part 5 - Behind The Scenes Part 2 - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

C# 4.0 Part 5 - Behind The Scenes Part 2

 

אז אחרי שהבנו אתמול Expression Tree והבנו שלשום שלמעשה כל dynamic הוא object, כעת נראה מה קורה כשעושים פעולות על dynamic.
 
מה לדעתכם מתרנדר כשכותבים את הקוד הבא:
 

    int i = 10;

 

    dynamic d = i;

    d++;

 
למעשה מה שקורה זה הקוד הבא (בערך - כי שיניתי את השמות של המשתנים)
 

    private static class SiteContainer

    {

        public static CallSite<Func<CallSite, object, object>> p1;

    }

 

 

    static void Main(string[] args)

    {

        if (SiteContainer.p1 == null)

        {

            SiteContainer.p1 = CallSite<Func<CallSite, object, object>>.Create(

                new CSharpUnaryOperationBinder(

                    ExpressionType.Increment,

                    false,

                    new CSharpArgumentInfo[] {

                        new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));

        }

 

        d = SiteContainer.p1.Target.Invoke(SiteContainer.p1, d);

 

    }

 
טיפה מסובך, אבל לא נורא.
 
למעשה נוצר לנו class סטטי שמכיל אובייקט מסוג CallSite (שהוא בסך הכל אובייקט שאמור לקבל delegate) סוג ה - delegate שנוצר תלוי כמובן לפי הפעולה שאנחנו מנסים לעשות. כשמפעילים מתודות נוצר delegate (לפעמים)  מסוג Action.
 
ב - Main בודקים האם כבר יצרנו את אותו משתנה סטטי, במידה ולא, מייצרים אותו. וכאן יש המון עבודה של הקומפיילר שצריך לייצר את הקוד, ולמעשה כל האובייקטים שמסתיימים עם Binder למעשה בונים Expression שניתן לקמפל ולהריץ.
 
בשורה האחרונה מריצים את המתודה של ה - delegate והפעולה מתבצעת.
 
 
מה שחושב כאן להבין, שאין קסמים, כשעושים פעולות על dynamic למעשה מתרנדר קוד שבסופו של דבר יוצר Expression שמתאר את הקוד שאנחנו רוצים להריץ.
 
אפשר לחפור בנושא הזה הרבה יותר עמוק, אבל אני מרגיש שזה יפספס את המטרה של סדרת הפוסטים, שהיא - מעבר על התכונות החדשות של C# 4.0 והבנה איך זה עובד מאחורי הקלעים, כשאגמור עם סדרת הפוסטים אני אחזור לנושא הזה ונכנס הרבה יותר עמוק בכל מה שקשור ל - Binders למיניהם. (מה זה Binder מה הוא מכיל, ירושה והרחבה של הפונקציונליות, ועוד)
 
 
 
הפוסט הבא יראה איך אפשר להגדיר ל - DLR על אובייקט מסוים להתנהג בצורה אחרת כשמשתמשים ב - dymanic עליו, לדוגמא - עם יש לנו אובייקט שמכיל xml, נוכל לגשת על האלמנטים שלו כאילו הם מאפיינים ולא נצטרך לגשת דרך indexer. וזאת על ידי ירושה מ - DynamicObject.
 
ועל כך בפוסט הבא (מחר בעזרת ה')
פורסם: Jun 22 2009, 07:41 AM by Shlomo | with 2 comment(s) |
תגים:, , ,

תוכן התגובה

pd כתב/ה:

:)!

# June 22, 2009 2:18 PM

Maxim כתב/ה:

אחלה סדרה שלמה :)

בגרסה חדשה של השפה יש כמה דברים נחמדים...

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

בסוף יוצא ש- #C ישלב בתוכו דברים שקיימים ב- VB וב- JS, שיכולים לחסוך זמן פיתוח, אבל יהיו פחות יעילים במקומות אחרים ושוב נחזור לבעיות שהיו ב- VB (ובכל השפות הפחות "קפדניות")... המתכנתים צריכים גם קצת לחשוב ולא לסמוך על הפיצ'רים היפים...

# June 22, 2009 3:22 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 8 and 2 and type the answer here:


Enter the numbers above: