Μια και το πιάσαμε το θέμα να προθέσω κι εγώ έναν 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