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

 

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

Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

Îåêßíçóå áðü ôï ìÝëïò angarato_surion. Τελευταία δημοσίευση από το μέλος rousso στις 28-11-2005, 11:49. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-11-2005, 21:07 7332

    Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Υδροβάση(Hydrobase)
    profiles :
    codeplex
    sourceforge
    google code

    Υλοποιώ εφαρμογές υπό πληρωμή απλώς επικοινωνήστε μαζί μου
  •  26-11-2005, 22:34 7334 σε απάντηση της 7332

    Απ: Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Έχεις δύο επιλογές:
    1. τα δηλώνεις const Σε αυτή την περίπτωση θέτεις την τιμή κατά την δήλωση.
    Π.χ. public const string MyString="TheString";
    2. τα δηλώνεις readonly Σε αυτή την περίπτωση θέτεις την τιμή ή κατά την δήλωση ή στον constructor.

    Πρακτικά, η πρώτη λύση είναι για static constants σε επίπεδο class ή για constants σε επίπεδο μεθόδου.
    Η δεύτερη είναι σαφώς πιό ευέλικτη:
    - Αρχικοποιείς όταν εκτελείται ο constructor, πράγμα που σημαίνει ότι μπορείς να την διαβάσεις από κάπου (config file, database)
    - Υπάρχει, σε επίπεδο class ευελιξία να έχεις static readonly (κοινά για όλα τα instances του class, αρχικοποιείς με static constructor) και instance readonly, με αρχικοποίηση στον instance constructor.

    Reference: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfReadonlyPG.asp

    Άρης


    Aris
  •  27-11-2005, 23:08 7354 σε απάντηση της 7334

    Απ: Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

     Aris wrote:

    Έχεις δύο επιλογές:
    1. τα δηλώνεις const Σε αυτή την περίπτωση θέτεις την τιμή κατά την δήλωση.
    Π.χ. public const string MyString="TheString";
    2. τα δηλώνεις readonly Σε αυτή την περίπτωση θέτεις την τιμή ή κατά την δήλωση ή στον constructor.

    Επειδή η δεύτερη πρόταση, παρ'ότι είναι πολύ σωστή, ίσως να σε μπερδέψει, να επεκτείνω τα λεγόμενα του Αρη λέγοντας οτι στη λύση νο.2 μιλάμε φυσικά για readonly properties. Τα properties "κρύβουν" συνήθως πίσω τους μια private μεταβλητή, και μπορούν να είναι φυσικά μόνο για ανάγνωση (read only). Τα υπόλοιπα είναι όπως ακριβώς τα περιγράφει ο Αρης, αλλά αν χρειαστείς περαιτέρω διευκρινίσεις, εδώ είμαστε!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  28-11-2005, 00:55 7356 σε απάντηση της 7332

    Απ: Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Μια και το πιάσαμε το θέμα να προθέσω κι εγώ έναν 3ο τρόπο για readonly properties και να κάνω και τις διευκρινήσεις μου για τα const και readonly keywords.

    Κατ' αρχήν για να μην αναρωτιέται κανείς γιατί να υπάρχει το readonly keyword όταν έχουμε ήδη το const (που μπορεί να πει κανείς ότι κληρονομήθηκε από την C), σημειώνω ότι το readonly keyword προστέθηκε για να δώσει την δυνατότητα να φτιάχνεις "σταθερές" των οποίων την τιμή την αποφασίζεις την ώρα που τρέχει η εφαρμογή και όχι την ώρα που κάνεiς compile. Το const keyword απαίτεί η τιμή να είναι γνωστή και σταθερή την ώρα του compilation. Οπότε δεν μπορείς να κάνεις assign σε ένα const τίποτα του οποίου η τιμή δεν είναι γνωστή την ώρα του compile. Αντίθετα μια readonly μεταβλητή, είναι μια κοινή μεταβλητή για την οποία απλά υπάρχει περισοριμσός στο πότε μπορείς να κάνεις ένα assgnment σε αυτήν. Το assignment σε μια readonly επιτρέπεται μόνο στο declaration ή/και στον constructor της class που την ορίζει. Τον έλεγχο για το που γίνεται το assignment τον κάνει ο compiler. Οπότε δηλώνοντας μια κοινή μεταβλητή σαν readonly είναι σαν να λες στον Compiler: "μην με αφήσεις να την κάνω assign πουθενά αλλού εκτός από τον constructor ή το declaration". Αντίθετα αν δηλώσεις const ο compiler δεν φτιάχνει καμία μεταβλητή (ούτε καν σύμβολο) αλλά χρησιμοποιεί απευθείας την σταθερή τιμή που θέτεις στην σταθερή σου όπου και αν την χρησιμοποιείς στον κώδικά σου. Δεν ξέρω τι ακριβώς κάνει ο compiler της C# αλλά υποθέτω ότι κάνει το αντίστοιχο με τους παλιότερους compilers της C και της assembly (δηλαδή βάζει hardcoded στον κώδικα μηχανής που παράγει (την IL στην συγκεκριμένη περίπτωση) την τιμή της σταθερής σου.

    Επίσης θα ήθελα να για μην γίνει κανένα μπέρδεμα να σημειώσω μια και ανέφερε ο φίλος cap την φράση "readonly properties" ότι δεν μιλάμε για properties. Τα properties δεν είναι μεταβλητές ή σταθερές. Τα properties είναι κώδικας στην ουσία. Δεν αντιπροσωπεύουν θέσεις μνήμης. Για να τα γράψεις και να τα διαβάσεις χρησιμοποιούν accessors (set και get αντίστοιχα). Οι accessors είναι στην πραγματικότητα methods. Οπότε δεν μπορείς να δηλώσεις ένα property ως const ή readonly.

    Έχοντας καλύψει το παραπάνω προσθέτω και τον εξής 3ο τρόπο για να έχεις μια readonly τιμή στην εφαρμογή σου εκτός από το να φιτάξεις ένα const ή ένα readonly field: Μπορείς να φτιάξεις ένα property χωρίς set accessor. Δεν μπάινω σε λεπτομέρειες. Αν κάποιος δεν ξέρει τις λεπτομέρειες κι έχει απορίες μπορεί να ρωτήσει, αλλά συνοπτικά μπορείς με τον τρόπο αυτό να έχεις ένα property το οποίο μπορεί να το γράφει όποτε θέλει η class που το ορίζει ενώ ταυτόχρονα δεν μπορεί παρά μόνο να διαβάζει οποιοδήποτε άλλο class.

    φιλικά
    rousso


    rousso
  •  28-11-2005, 11:23 7363 σε απάντηση της 7356

    Απ: Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Το γεγονός ότι ο compiler αντικαθιστά τις αναφορές στα const με τις τιμές τους έχει μια σχετικά περίεργη συνέπεια. Αν ένα assembly χρησιμοποιεί ένα const που ορίστηκε σε άλλο assembly και η τιμή του const αλλάξει, το πρώτο assembly θα συνεχίσει να χρησιμοποιεί την πρώτη τιμή.

    Όσον αφορά τον compiler, const σημαίνει const για πάντα, οπότε μπορεί να κάνει οποιουδήποτε είδους optimization θέλει.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-11-2005, 11:49 7365 σε απάντηση της 7363

    Απ: Πως λυνουμε το προβλημα τα strings να ειναι readonly στην c#;

    Σωστή η παρατήρηση Παναγιώτη.

    Διευκρινίζω ότι εννοείς ότι αν το assembly με το declaration (ας πούμε A.dll) γίνει recompile χωρίς να γίνει recompile το assembly με το "reference" (ας πούμε B.dll), τότε το δεύτερο assembly (δηλαδή το B.dll) έχει ήδη hardcoded την τιμή που ήταν δηλωμένη στο const κατά την διάρκειτα του τελευταίου compilation του B.dll. Οπότε μπορεί το assembly A.dll σε μεταγενέστερο compilation να έχει μια διαφορετική τιμή για την ίδια const από εκείνη που έχει το B.dll από προγενέστερο compilation....

    Σωστό! Δεν μου είχε τύχει ποτέ αλλά λογικά έτσι είναι...

    bugger!

    rousso
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems