Videogames Laboratory

O συναρπαστικός κόσμος της ανάπτυξης βιντεοπαιχνιδιών

Εισαγωγή στη C#/.NET μέρος 3ο

Δημοσιεύθηκε από Κώστας Αναγνώστου στο Ιουνίου 29, 2009

Είχαμε ξεκινήσει σε προηγούμενα άρθρα μια εισαγωγή στην C# και στο .NET ως υπόβαθρο για την μετέπειτα χρήση του XNA Game Studio. Αρκετούς μήνες μετά συνεχίζουμε την περιήγηση μας στο κόσμο της C#.

Στο προηγούμενο άρθρο ως γνωριμία με την C# και το περιβάλλον του Visual C# Express 2008, είχαμε δημιουργήσει ένα απλό πρόγραμμα που εμφάνιζε μια πρόταση σε ένα παράθυρο. Σήμερα συνεχίζουμε με το πώς αναπαριστά και διαχειρίζεται η C# δεδομένα. Σκοπός αυτού του άρθρου δεν είναι η πλήρης και εξονυχιστική παρουσίαση της γλώσσας, μιας και κάτι τέτοιο θα μπορούσε να γίνει μόνο στα πλαίσια ενός βιβλίου.

Σε γενικές γραμμές η C#, όσον αφορά τις μεταβλητές και τους τύπους δεδομένων της, δεν διαφέρει δραματικά από γλώσσες όπως η Java και η C++. Κάποιος με εμπειρία σε άλλες (σχετικά σύγχρονες) γλώσσες θα βρεθεί σε ένα οικείο περιβάλλον κατά την ανάπτυξη ενός προγράμματος σε C#. Ξεκινάμε με μια γρήγορη ανασκόπηση των τύπων δεδομένων που υποστηρίζει η C#.

Μεταβλητές

Η C# υποστηρίζει τους παραδοσιακούς τύπους δεδομένων όπως int για ακέραιους αριθμούς, float για αριθμούς κινητής υποδιαστολής, string για κείμενο, char για χαρακτήρες. Επιπλέον υποστηρίζει του τύπους class και struct οι οποίοι επιτρέπουν στο χρήστη να ορίσει δικά του αντικείμενα.

Ο παρακάτω πίνακας περιλαμβάνει τους πιο κοινούς τύπους δεδομένων που χρησιμοποιούμε κατά το προγραμματισμό με C#

Τύπος Δεδομένα Παράδειγμα χρήσης
bool true ή false bool isRaining = false;
byte Ακέραιος αριθμός από 0 μέχρι 255 byte counter=4;
short Ακέραιος αριθμός από –32,768 μέχρι 32,767 short myNumber = -3442;
int Ακέραιος αριθμός 32 bit int largeNumber = 1234223;
double Αριθμός κινητής υποδιαστολής μεγάλης ακρίβειας double stockValue = 2342.23332;
float Αριθμός κινητής υποδιαστολής float exchangeRate = 233.23f;
char Χαρακτήρας ASCII 8 bit char myChar = ‘a’;
string Κείμενο string username = “Kostas”;

Μερικές παρατηρήσεις πάνω στους τύπους δεδομένων: Οι τύποι short και int έχουν παρόμοια χρήση, μόνο που ο int έχει μεγαλύτερο εύρος, δηλαδή μπορεί να αποθηκεύσει μεγαλύτερο εύρος (περισσότερους) αριθμούς από ότι ο short. Αυτό συμβαίνει γιατί μια μεταβλητής τύπου short χρησιμοποιεί 16 bit στην μνήμη ενώ μια int 32 bit. Το ίδιο ισχύει για τους τύπους float (32bit) και double (64bit). Ο χαρακτήρας f στο τέλος του αριθμού στο παράδειγμα για το τύπο float σηματοδοτεί ότι ο αριθμός αυτός είναι πράγματι τύπου float (και συνεπώς απαιτεί λιγότερο χώρο για να αποθηκευτεί). Τέλος ένας χαρακτήρας (char) ορίζεται με μονά εισαγωγικά και ένα κείμενο (string) με διπλά.

Class και αντικείμενα

Πέρα από αυτούς τους βασικούς τύπους δεδομένων, η C# υποστηρίζει και το τύπο class. H class μας επιτρέπει να ορίσουμε δικά μας αντικείμενα. Εν συντομία για όσους δεν γνωρίζουν τι είναι, ένα αντικείμενο σε μια αντικειμενοστραφή γλώσσα προγραμματισμού (όπως η C#, C++, Java κλπ), είναι μια οντότητα που χαρακτηρίζεται από δεδομένα και συμπεριφορά. Τα αντικείμενα αυτά έχουν άμεση αντιστοίχιση με αντικείμενα του πραγματικού κόσμου. Για παράδειγμα ένα αυτοκίνητο σε ένα παιχνίδι αγώνων ράλι χαρακτηρίζεται από το χρώμα του, το πόσες πόρτες έχει, την ταχύτητα του, την κατεύθυνση του, αν έχει ταχύτητες ή είναι αυτόματο, το ποσοστό ζημίας από τρακαρίσματα που έχει υποστεί. Αυτά είναι τα δεδομένα που περιγράφουν το αντικείμενο του αυτοκινήτου. Επιπλέον μπορούμε να ορίσουμε και κάποιες «λειτουργίες» που επιδρούν και διαχειρίζονται τα δεδομένα αυτά. Μια λειτουργία θα μπορούσε να είναι η «αλλαγή ταχύτητας». Μια άλλη «πάτημα γκαζιού». Οι λειτουργίες αυτές αλλάζουν τις τιμές των δεδομένων του αντικειμένου.

Στην C# το αντικείμενο του αυτοκινήτου μεταφέρεται ως

class Car
{
    private float speed;
    private int gear;

    public Car()
    {
        speed = 0;
        gear = 0;
    }

    public void IncreaseSpeed(float amount)
    {
        speed = speed + amount;
    }

    public void DecreaseSpeed(float amount)
    {
        speed = speed - amount;
    }

    public void ChangeGear(int newGear)
    {
        gear = newGear;
    }
}

Με το τρόπο αυτό ορίζουμε ένα νέο τύπο δεδομένων, το αντικείμενο Car το οποίο περιγράφει με απλοϊκό τρόπο μια οντότητα αυτοκινήτου και διάφορες λειτουργίες πάνω σε αυτό (με επίσης απλοϊκό τρόπο). To αντικείμενο περιλαμβάνει 2 μεταβλητές speed και gear περιέχουν την τρέχουσα ταχύτητα και ταχύτητα (δεν είναι φοβερά τα νέο-ελληνικά όσον αφορά τους τεχνολογικούς όρους;) του αυτοκινήτου, συναρτήσεις (μεθόδους) για αύξηση και μείωση της ταχύτητας και μια ειδική μέθοδο (Car()) τη οποίας την ύπαρξη θα εξηγήσω σε λίγο.

Για να ορίσουμε ένα αυτοκίνητο με βάση το πρότυπο αυτό το δηλώνουμε ως εξής:

Car audiQuattro;

Η παραπάνω δήλωση δημιουργεί μια μεταβλητή τύπου Car, αλλά δεν δεσμεύει μνήμη για το αντικείμενο αυτό καθ’αυτό. Αυτό πρέπει να γίνει ως εξής:

audiQuattro = new Car();

Ο τελεστής new δεσμεύει όση ακριβώς μνήμη χρειάζεται για να αποθηκευτεί ένα αντικείμενο τύπου Car. Το audiQuattro είναι τώρα ένα νέο αντικείμενο τύπου Car. Για να αλλάξω τις ιδιότητες (μεταβλητές) του νέου αυτοκινήτου καλώ απλά τις μεθόδους του:

audiQuattro.ChangeGear(1);
audiQuattro.IncreaseSpeed(20);

Παρατηρούμε ότι οι μεταβλητές δηλώνονται ως private και οι μέθοδοι ως public. Σε ένα αντικείμενο, οτιδήποτε δηλώνεται ως private δεν είναι ορατό και προσπελάσιμο εκτός του αντικειμένου. Αντίθετα, οτιδήποτε δηλώνουμε ως public είναι. Για παράδειγμα η παρακάτω χρήση δεν είναι επιτρεπτή:

audiQuattro.speed = 15.0f;

Αυτό συμβαίνει γιατί η speed έχει δηλωθεί ως private. Ο μεταγλωττιστής της C# δεν θα επιτρέψει την ολοκλήρωση της δημιουργίας του εκτελέσιμου κώδικα και θα επισημάνει το λάθος.

Ο χαρακτηρισμός private/public δεν ανήκει αποκλειστικά σε μεταβλητές/μέθοδους αλλά σε οτιδήποτε περιέχει ένα αντικείμενο. Θα μπορούσε για παράδειγμα η μεταβλητή speed να είναι public.

Τέλος θέλω να αναφερθώ στη μέθοδο Car(). Η μέθοδος αυτή, που έχει πάντα το ίδιο όνομα με το class που τη περιέχει ονομάζεται constructor και καλείται πάντα όταν δεσμεύουμε μνήμη για ένα αντικείμενο του αντίστοιχου τύπου με τη χρήση του τελεστή new. Σκοπός της είναι η αρχικοποίηση του αντικειμένου δίνοντας για παράδειγμα κάποια αρχική τιμή στις μεταβλητές του. Στο συγκεκριμένο παράδειγμα τη χρησιμοποιούμε για να θέσουμε αρχικές τιμές 0 στις μεταβλητές speed και gear (κάτι που δεν είναι απολύτως απαραίτητο, καθώς γίνεται αυτόματα όπως θα δούμε σε άλλο άρθρο).

Εκτός της class, η C# υποστηρίζει τη δημιουργία νέων τύπων δεδομένων με τη χρήση της struct. Η struct είναι παρόμοια σε χρήση με τη class, διαφέρει όμως σε μερικά σημεία τα οποία θα αναλύσουμε σε επόμενο άρθρο.

Ανακεφαλαιώνοντας, η C# υποστηρίζει βασικούς τύπους δεδομένων (primitive types), όπως ο int, short, char κλπ, και πιο σύνθετους όπως η class (reference types). Μια βασική διαφορά τους είναι ότι ένα βασικό τύπο μπορώ να τον ορίσω απευθείας:

int value = 22;

ενώ ένα πιο σύνθετο τύπου (class) πρέπει να χρησιμοποιήσω το τελεστή new για να δεσμεύσω μνήμη για αυτό:

Car fiat = new Car();

Αυτή η διαφορά έχει μεγάλη επίπτωση στη χρήση τους και σε τι είδους μνήμη αποθηκεύονται, κάτι που έχει με την σειρά του επίπτωση στην ανάπτυξη βιντεοπαιχνιδιών με το XNA Game Studio.

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

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

Υποβολή απάντησης

XHTML: Μπορείτε να χρησιμοποιήσετε αυτές τις ετικέτες: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>