Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Μα δεν θα έπρεπε να κάνει compile!

Îåêßíçóå áðü ôï ìÝëïò Mitsaras. Τελευταία δημοσίευση από το μέλος PALLADIN στις 27-06-2009, 11:26. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-06-2009, 05:28 51990

    Μα δεν θα έπρεπε να κάνει compile!

    Βλέποντας ένα από τα mock classes μου, έπεσα πάνω σε αυτό το κομμάτι κώδικα:
                return new Dictionary<int, CategoryBase>
                {
                    { 0, new Category(0, null, null, null, 0) },
                    { 1, new Category(1, 0, null, null, 0) },
                     ...........
                    { 31, new Category(31, null, null, null, 0) },
                    { 32, new Category(32, null, null, null, 0) },
                };
    Παρατηρήστε την προτελευταία γραμμή, όπου υπάρχει ένα κόμμα στο τέλος. Γιατί αυτός ο κώδικας κάνει compile κανονικά; Δεν θα έπρεπε να διαμαρτυρηθεί το IDE για syntax error ή έστω Argument Expected; Ξέρω ότι παρόμοια συμπεριφορά είναι επιτρεπτή στην C++ (C99 και μετά), αλλά μου φαίνεται μάλλον ασυνήθιστο για την C#. Υπάρχουν κι άλλα τέτοια "features" στην γλώσσα άραγε;

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  27-06-2009, 01:01 52038 σε απάντηση της 51990

    Απ: Μα δεν θα έπρεπε να κάνει compile!

    Δεν είναι καθόλου ασυνήθιστο. Είναι κανονικό feature, χωρίς εισαγωγικά, της C# 3.0. Λέγεται Collection initializer, Δες το θέμα "How to: Initialize a Dictionary with a collection initializer" στο MSDN. Θα δεις και ένα παράδειγμα ολόιδιο με το δικό σου!

     


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  27-06-2009, 01:10 52039 σε απάντηση της 52038

    Απ: Μα δεν θα έπρεπε να κάνει compile!

    Παναγιώτη, δεν αναφέρομαι στα collection initializers αλλά στο κόμμα στο τέλος.

    Απ' ό,τι κατάλαβα είναι για να κάνει την ζωή ευκολότερη στον compiler και τα codegen εργαλεία, και να βελτιώσει το... copy pasting.

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  27-06-2009, 01:50 52041 σε απάντηση της 52039

    Απ: Μα δεν θα έπρεπε να κάνει compile!

    Έχεις απόλυτο δίκιο. Δικό μου το λάθος, δεν είναι ακριβώς το ίδιο το παράδειγμα στο MSDN, αλλά όντως είναι ένα χαλαρό πρότυπο για να αφήνει τους code gens να κάνουν τη δουλειά τους πιο εύκολα.

    Όσο για άλλα κρυφά κουσούρια, δεν μπορώ να πω ότι έχω συγκεκριμένα παραδείγματα. Είναι όμως πάντα πολύ ενδιαφέρον να βλέπεις τον IL κώδικα που δημιουργείται από C#, ή να αναλύεις με έναν καλό Memory Profiler,ή να κάνεις advanced debugging με τα MS Debug Tools for Windows (και τα κατάλληλα symbol files). Έτσι βλέπεις βαθύτερα τι γίνεται με τον κώδικά σου.
    Ακόμα και χρησιμοποιόντας μόνο τον Task Manager ή και το sysinternals Process Explorer έχω βρει διάφορα περίεργα φαινόμενα, π.χ. με dynamic memory allocation, garbage collection, κλπ.


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  27-06-2009, 04:55 52042 σε απάντηση της 51990

    Απ: Μα δεν θα έπρεπε να κάνει compile!

    Mitsaras:
                return new Dictionary<int, CategoryBase>
                {
                    { 0, new Category(0, null, null, null, 0) },
                    { 1, new Category(1, 0, null, null, 0) },
                     ...........
                    { 31, new Category(31, null, null, null, 0) },
                    { 32, new Category(32, null, null, null, 0) },
                };
    Σε τέτοιες περιπτώσεις ο compiler φτιάχνει εσωτερικά ένα αντικείμενο Dictionary και για κάθε αντικείμενο της λίστας καλεί την Add.Οπότε λογικό είναι να υποθέσουμε ότι κάνει 
    το parsing κάπως έτσι:
    {.....},
     
    παρόμοια με ένα comma-delimited file φαντάζομαι.Οπότε μπορεί χαλαρά να αγνοήσει ένα κόμμα στο τέλος.Στο πρότυπο της γλώσσας δεν βρήκα να γράφει ότι μπορείς να το κάνεις αλλά
    και ούτε ότι δεν δικαιούσαι.
    Το πρόβλημα πλέον με τη C# είναι ότι ο κώδικας που γράφεις και ο κώδικας που παράγεται είναι διαφορετικοί:anonymous methods,lambda expressions,initializer lists,Linq expressions,
    όλα αυτά και ακόμα παραπάνω είναι αντικείμενα για reparsing από τον compiler.Έρχεται και το functional programming στην C#4.0 και θα δούμε πότε πλέον θα έχει χαθεί εντελώς ο έλεγχος 
    στο τι κώδικας παράγεται από αυτόν που γράφουμε.
  •  27-06-2009, 11:26 52046 σε απάντηση της 51990

    Απ: Μα δεν θα έπρεπε να κάνει compile!

    Καλησπέρα

    Είναι η περίπτωση του περιβόητου "trailing-superfluous comma".
    Υπάρχει ως alternative production rule για να βοηθήσει σε
    copy-paste και code generation σενάρια.

    To C# 3.0 spec έχει πολλές και ενδιαφέρουσες λεπτομέρειες
    http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx

    collection-initializer:
    {   element-initializer-listopt   }
    {   element-initializer-list   ,   }

     


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems