C# COMPLETE COURSE

image description

ΕΝΟΤΗΤΑ 17 - READONLY AND CONSTANT FIELDS

INTRODUCTION

Σε αυτό το δωρεάν μάθημα C# θα δούμε αναλυτικά πως τα constant fields αλλά και τα readonly fields διαφέρουν από τα static fields που μάθαμε στην προηγούμενη ενότητα.

CONSTANT FIELD DEFINITION

Στην προηγούμενη ενότητα, είχαμε δει αναλυτικά, ότι για να μπορέσει ένα field να συμπεριφέρεται σαν static θα πρέπει να έχουμε προσθέσει την λέξη κλειδί static πριν από τον ορισμό του ονόματος του. Αυτή η ίδια λογική ισχύει και με τις δύο καινούργιες έννοιες που θα αναλύσουμε σε αυτό το δωρεάν μάθημα C# ξεκινώντας πρώτα από την έννοια του constant field.

Για να ορίσουμε ένα constant field θα πρέπει να ορίσουμε πριν από το όνομα του field την λέξη κλειδί const. Η συγκεκριμένη λέξη έρχεται να προσθέσει νέες ιδιότητες στο field που κατά κάποιο τρόπο περιορίζεται σε μια συγκεκριμένη συμπεριφορά. Για να καταλάβετε όμως καλύτερα πως επηρεάζεται ένα field από την λέξη κλειδί const, ας δημιουργήσουμε ένα επιπλέον field με το όνομα categoryName στην κλάση Product και ας το ορίσουμε σαν const.

Product.cs

Όπως ήδη αναφέραμε, η λέξη κλειδί const έχει προσθέσει μια διαφορετική συμπεριφορά στο field. Η πρώτη αλλαγή είναι ότι μια const μεταβλητή είναι και static οπότε η πρόσβαση σε αυτή δεν γίνεται μέσω αντικειμένων αλλά μέσω της ίδιας της κλάσης και φυσικά δεν είναι ανάγκη να χρησιμοποιήσουμε και την λέξη static ξανά. Η μεγάλη διαφορά όμως είναι ότι μια const μεταβλητή από την στιγμή που αναθέσουμε μια τιμή, δεν μας επιτρέπει να την αλλάξουμε ξανά. Στην ουσία δημιουργούμε μια σταθερά της οποίας η τιμή δεν μπορεί να αλλάξει κατά την διάρκεια εκτέλεσης του κώδικα. Επειδή λοιπόν η C# θα "κλειδώσει" κατά κάποιο τρόπο την τιμή και δεν θα επιτρέπει περαιτέρω αλλαγές, απαιτεί να αναθέσουμε την τιμή στην μεταβλητή την ίδια στιγμή που την ορίζουμε. Στο παραπάνω παράδειγμα, βλέπουμε ότι στο field categoryName αναθέσαμε τη string τιμή "Electronics" γιατί η μεταβλητή έχει οριστεί σαν const.

Για να καλέσουμε την μεταβλητή μέσα στο κώδικα μας δεν έχουμε παρά να χρησιμοποιήσουμε το όνομα της κλάσης, τελεία και το όνομα του const field. Στη κλάση Program προσθέτουμε ακόμα ένα System.Console statement που καλεί και μας δείχνει στο terminal την τιμή του categoryName field.

Program.cs

Output

Δωρεάν Μαθήματα C#

READONLY FIELD DEFINITION

Τα const fields συμπεριφέρονται σαν static που σημαίνει ότι ανήκουν στην κλάση και όχι στα αντικείμενα που δημιουργούμε από την κλάση. Θα μπορούσαμε όμως να είχαμε μια συμπεριφορά παρόμοια με των const fields και σε επίπεδο αντικειμένων όπου κάθε αντικείμενο θα περιέχει το δικό του ξεχωριστό const field? Ναι, αυτό είναι εφικτό χρησιμοποιώντας την λέξη κλειδί readonly πριν από τον ορισμού του field. Αντί λοιπόν να ορίσουμε ένα field σαν const, μπορούμε να το ορίσουμε σαν readonly. Τότε δεν θα ανήκει στην κλάση αλλά κάθε αντικείμενο θα περιέχει το δικό του ξεχωριστό readonly field. Τέλεια!!! Όμως αν ορίσουμε μια αρχική τιμή στο field σε επίπεδο κλάσης, τότε κάθε αντικείμενο που θα δημιουργούμε και περιέχει το συγκεκριμένο field θα έχει την ίδια τιμή όπως όλα τα άλλα. Αυτό δεν μας είναι και τόσο χρήσιμο αφού ο σκοπός της δημιουργίας των αντικειμένων είναι η ιδιότητά τους να περιέχουν ξεχωριστές τιμές το ένα από το άλλο. Εδώ η C# μας επιτρέπει να ορίσουμε ένα readonly field με δύο τρόπους - είτε με αρχική ανάθεση τιμής στο field, είτε με ανάθεση τιμή κατά την δημιουργία του αντικειμένου μέσω του constructor. Με άλλα λόγια, δεν είναι ανάγκη να ορίσουμε μια αρχική τιμή μέσα στην κλάση. Μπορούμε να περιμένουμε μέχρι την στιγμή που θα δημιουργήσουμε το αντικείμενο και να αναθέσουμε την τιμή εκείνη την στιγμή. Φυσικά, όπως και στα const fields, από τη στιγμή που γίνει η ανάθεση, δεν θα μπορέσουμε να την αλλάξουμε κατά τη διάρκεια εκτέλεσης του προγράμματος μας.

Το πρόβλημα μας λύθηκε, όμως εισάγουμε μια καινούργια έννοια που λέγεται constuctor. Δεν θα μιλήσουμε καθόλου για constructors σε αυτό το δωρεάν μάθημα C# γιατί ακόμα δεν είναι επίσημα η σειρά τους όμως θα δώσουμε μια γρήγορη εξήγηση για το τι ακριβώς κάνει για να καταλάβετε και τον κώδικα που θα γράψουμε αμέσως μετά. Ο constructor λοιπόν είναι υπεύθυνος για την δημιουργία των αντικειμένων και αυτός είναι που εκτελείται σε κάθε παράδειγμα που έχουμε εκτελέσει μέχρι τώρα. Αν δεν ορίσουμε εμείς ένα constructor μας προμηθεύει έναν η C# αυτόματα. Αυτός ο συγκεκριμένος constructor επειδή δεν δέχεται και καμία τιμή ονομάζεται και no-argument constructor. Μπορούμε αυτόν τον constructor να τον γράψουμε μέσα στον κώδικα μας και να τον χρησιμοποιήσουμε για να αρχικοποιήσουμε την τιμή στο readonly field. Ο constructor έχει το ίδιο όνομα με την κλάση και μοιάζει στη σύνταξη σε μια μέθοδο. Φυσικά διαφέρει σε πολλά άλλα πράγματα, αλλά αυτή η θεωρία είναι αρκετή για τώρα για να κατανοήσουμε τον απλό κώδικα που πρόκειται να γράψουμε.

Ας πάμε λοιπόν στην κλάση Product και ας προσθέσουμε ένα ακόμα field με το όνομα dateOfPurchase. Επειδή αυτό το field θέλουμε να πάρει την ημερομηνία που δημιουργούμε το αντικείμενο σαν τιμή, το ορίζουμε μέσα σε ένα constructor και επειδή επίσης θέλουμε να μην αλλάξει ξανά η αρχική του τιμή τότε το ορίζουμε και σαν readonly.

Product.cs

Τώρα μέσα στο Program, το κάθε αντικείμενο που έχουμε δημιουργήσει θα περιέχει τη δική του τιμή ημερομηνίας για το dateOfPurchase field. Επειδή και τα δύο αντικείμενα τα δημιουργούμε σχεδόν ταυτόχρονα η ημερομηνία στο τελικό αποτέλεσμα θα είναι η ίδια. Αν όμως προσθέσετε την ώρα θα μπορείτε να δείτε την διαφορά.

Program.cs

Output

Δωρεάν Μαθήματα C#

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

Μιχάλης Κασάπογλου

Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.

loader