Τι είναι οι Μεταβλητές στην C#;

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

Πώς Λειτουργούν οι Μεταβλητές;

  1. Δήλωση Μεταβλητής

  1. Όταν δηλώνεις μια μεταβλητή, είναι σαν να λες στον υπολογιστή ότι θέλεις να δημιουργήσεις ένα νέο κουτί για να αποθηκεύσεις κάτι συγκεκριμένο.

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

  1. Πώς το γράφουμε: int age;
  1. Αρχικοποίηση Μεταβλητής

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

  1. Παράδειγμα: Δίνεις στην ηλικία σου την τιμή 10.

  1. Πώς το γράφουμε: age = 10;
  1. Χρήση Μεταβλητής

  1. Μπορείς να χρησιμοποιήσεις τη μεταβλητή όποτε θέλεις για να κάνεις πράγματα με την τιμή που αποθηκεύει, όπως να τη δεις ή να την αλλάξεις.

  1. Παράδειγμα: Να εμφανίσεις την ηλικία σου στην οθόνη ή να την αυξήσεις κατά 1.

  1. Πώς το γράφουμε: Console.WriteLine(age); ή age = age + 1;

Τύποι Δεδομένων για Μεταβλητές

Οι μεταβλητές στην C# μπορούν να κρατούν διαφορετικά είδη πληροφοριών. Τα πιο συνηθισμένα είναι:

  1. int (Ακέραιοι Αριθμοί)
    • Κρατούν ακέραιους αριθμούς χωρίς δεκαδικά.
    • Παράδειγμα: int numberOfApples = 5;

  1. double (Αριθμοί με Δεκαδικά)
    • Κρατούν αριθμούς με δεκαδικά ψηφία.
    • Παράδειγμα: double appleWeight = 1.25;

  1. string (Κείμενο)
    • Κρατούν ακολουθίες χαρακτήρων, όπως λέξεις και προτάσεις.
    • Παράδειγμα: string myName = "Μυρσίνη";

  1. bool (Λογικές Τιμές)
    • Κρατούν τιμές αληθές (true) ή ψευδές (false).
    • Παράδειγμα: bool hasApples = true;

  1. List<T> (Λίστες)
    • Κρατούν συλλογές αντικειμένων του ίδιου τύπου.
    • Παράδειγμα: List<string> friends = new List<string> { "Αντώνης", "Βασίλης", "Ελένη" };

  1. DateTime (Ημερομηνία και Ώρα)
    • Κρατούν ημερομηνίες και ώρες.
    • Παράδειγμα: DateTime birthDate = new DateTime(2000, 1, 1);

  1. Πίνακες

  1. List<T>

  1. Dictionary

  1. HashSet

  1. Queue

  1. Stack

  1. NULLABLE ΜΕΤΑΒΛΗΤΕΣ:
  1. Public / Private

Παραδείγματα

  1. Δήλωση και Αρχικοποίηση Μεταβλητής int

int age = 10;
Console.WriteLine(“Η ηλικία μου είναι ” + age);

Τι κάνει:

  • Δημιουργεί μια μεταβλητή age τύπου int και της δίνει την τιμή 10.
  • Εμφανίζει την ηλικία στην οθόνη.
  1. Δήλωση και Αρχικοποίηση Μεταβλητής double

double weightOfApple = 1.25;
double totalWeight = weightOfApple * 4;
Console.WriteLine(“Το συνολικό βάρος είναι ” + totalWeight + ” κιλά”);

Τι κάνει:

  • Δημιουργεί μια μεταβλητή weightOfApple τύπου double και της δίνει την τιμή 1.25.
  • Υπολογίζει το συνολικό βάρος για 4 μήλα και το εμφανίζει στην οθόνη.
  1. Δήλωση και Αρχικοποίηση Μεταβλητής string

string name = “Μυρσίνη”;

Console.WriteLine(“Γειά σου, ” + name + “!”);

Τι κάνει:

  • Δημιουργεί μια μεταβλητή name τύπου string και της δίνει την τιμή "Μυρσίνη".
  • Εμφανίζει έναν χαιρετισμό στην οθόνη χρησιμοποιώντας την τιμή της name.
  1. Δήλωση και Αρχικοποίηση Μεταβλητής bool

bool hasApples = true;
if (hasApples)
{
Console.WriteLine(“Έχεις μήλα!”);
}
else
{
Console.WriteLine(“Δεν έχεις μήλα.”);
}

Τι κάνει:

  • Δημιουργεί μια μεταβλητή hasApples τύπου bool και της δίνει την τιμή true.
  • Χρησιμοποιεί την τιμή της hasApples για να ελέγξει αν έχει μήλα ή όχι και εμφανίζει το ανάλογο μήνυμα.

Οι μεταβλητές στην C# είναι πολύ σημαντικές γιατί σου επιτρέπουν να αποθηκεύεις και να διαχειρίζεσαι πληροφορίες στον κώδικά σου. Είναι σαν μικρά κουτιά που κρατούν πολύτιμα δεδομένα που μπορείς να χρησιμοποιήσεις όποτε τα χρειάζεσαι.

DateTime

Η κατανόηση του αντικειμενοστραφή προγραμματισμού (OOP) με το DateTime τύπο στην C# μπορεί να είναι πολύ χρήσιμη.

Ο DateTime είναι μια από τις βασικές κλάσεις στην C# που παρέχεται από το .NET Framework και χρησιμοποιείται για την αναπαράσταση ημερομηνιών και ωρών.

Ας δούμε πώς λειτουργεί ο DateTime με βάση τις έννοιες του αντικειμενοστραφή προγραμματισμού:

1. Τι είναι ο DateTime τύπος;

Ο DateTime είναι μια κλάση στην C# που ανήκει στο namespace System. Χρησιμοποιείται για την αναπαράσταση ημερομηνιών και ωρών με ακρίβεια ημερομηνίας και ώρας.

2. Χαρακτηριστικά της Κλάσης DateTime:

  • Ιδιότητες:

  • Year: Το έτος της ημερομηνίας.
  • Month: Ο μήνας της ημερομηνίας.
  • Day: Η ημέρα της ημερομηνίας.
  • Hour: Η ώρα της ημερομηνίας.
  • Minute: Το λεπτό της ημερομηνίας.
  • Second: Το δευτερόλεπτο της ημερομηνίας.

  • Μέθοδοι:

  • AddDays(double value): Προσθέτει μια καθορισμένη ποσότητα ημερών στην ημερομηνία.

  • AddMonths(int months): Προσθέτει μια καθορισμένη ποσότητα μηνών στην ημερομηνία.

  • ToString(): Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημερομηνία και ώρα με μια καθορισμένη μορφή.

3. Αντικειμενοστραφή Προσέγγιση με DateTime:

Στην αντικειμενοστραφή προσέγγιση, ο τύπος DateTime αναπαριστά ένα αντικείμενο με τις εξής έννοιες:

Αντικείμενα: Κάθε DateTime είναι ένα αντικείμενο που περιέχει δεδομένα σχετικά με μια συγκεκριμένη ημερομηνία και ώρα.

Μέθοδοι:

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

Ιδιότητες:

Το DateTime αντικείμενο έχει διάφορες ιδιότητες που μπορούν να ανακτηθούν και να χρησιμοποιηθούν, όπως Year, Month, Day, κ.λπ.

4. Παράδειγμα Χρήσης του DateTime:

Ας δούμε ένα απλό παράδειγμα που δείχνει πώς να δημιουργήσεις και να χρησιμοποιήσεις αντικείμενα DateTime:

using System;

class Program
{
    static void Main()
    {

        // Δημιουργία ενός αντικειμένου

 
DateTime που αναπαριστά την τρέχουσα ημερομηνία και ώρα
        DateTime now = DateTime.Now;


        // Δημιουργία ενός αντικειμένου 


DateTime με συγκεκριμένη ημερομηνία και ώρα
        DateTime specificDate = new DateTime(2024, 7, 24, 14, 30, 0);


        // Εμφάνιση της τρέχουσας ημερομηνίας και ώρας


        Console.WriteLine("Current Date and Time: " + now.ToString());


        // Εμφάνιση της συγκεκριμένης ημερομηνίας και ώρας


        Console.WriteLine("Specific Date and Time: " + specificDate.ToString());


        // Πρόσθεση 10 ημερών στην συγκεκριμένη ημερομηνία


        DateTime newDate = specificDate.AddDays(10);
        Console.WriteLine("Date after 10 days: " + newDate.ToString());



        // Εμφάνιση του μήνα της συγκεκριμένης ημερομηνίας


        Console.WriteLine("Month of the specific date: " + specificDate.Month);

    }
}

Επεξήγηση του Κώδικα:

  • DateTime.Now: Δημιουργεί ένα αντικείμενο DateTime που περιέχει την τρέχουσα ημερομηνία και ώρα.

  • new DateTime(...): Δημιουργεί ένα αντικείμενο DateTime με συγκεκριμένη ημερομηνία και ώρα.

  • AddDays(10): Προσθέτει 10 ημέρες στην αρχική ημερομηνία.

  • ToString(): Επιστρέφει την ημερομηνία και ώρα ως συμβολοσειρά.

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

Τύπος int (Ακέραιος αριθμός)

1. Τύπος int (Ακέραιος αριθμός)

Αντικειμενοστραφή Προσέγγιση:

Ο τύπος int στην C# είναι δομημένος τύπος (value type), αλλά μπορείς να χρησιμοποιήσεις την κλάση Int32 για να αλληλεπιδράσεις με ακέραιους αριθμούς σαν αντικείμενα.

Ιδιότητες και Μέθοδοι:

  • Μέθοδοι:
    • ToString(): Μετατρέπει τον ακέραιο αριθμό σε συμβολοσειρά.

  • CompareTo(int value): Συγκρίνει τον αριθμό με έναν άλλο ακέραιο αριθμό.

  • Parse(string s) Μετατρέπει μια συμβολοσειρά σε ακέραιο αριθμό. Παράδειγμα: int number = Int32.Parse("123");

  • TryParse(string s, out int result) Προσπαθεί να μετατρέψει μια συμβολοσειρά σε ακέραιο αριθμό και επιστρέφει true αν η μετατροπή είναι επιτυχής, διαφορετικά επιστρέφει false.

  • ToString(int value) Μετατρέπει έναν ακέραιο αριθμό σε συμβολοσειρά. Παράδειγμα: string str = Int32.ToString(123);

  • Compare(int x, int y) Συγκρίνει δύο ακέραιους αριθμούς και επιστρέφει έναν ακέραιο αριθμό που δείχνει αν ο πρώτος αριθμός είναι μικρότερος, ίσος ή μεγαλύτερος από τον δεύτερο. Παράδειγμα: int comparison = Int32.Compare(123, 456);

  • MaxValue Επιστρέφει την μεγαλύτερη τιμή που μπορεί να έχει ένας ακέραιος αριθμός (2147483647). Παράδειγμα: int max = Int32.MaxValue;

  • MinValue Επιστρέφει την μικρότερη τιμή που μπορεί να έχει ένας ακέραιος αριθμός (-2147483648). Παράδειγμα: int min = Int32.MinValue;

  • GetTypeCode() Επιστρέφει τον κωδικό τύπου (TypeCode) για τον τύπο int. Παράδειγμα: TypeCode typeCode = ((IConvertible)number).GetTypeCode();

Παράδειγμα:

using System;

class Program
{
static void Main()
{
int number = 123;

// Χρήση της μεθόδου ToString

    string numberString = number.ToString();
    Console.WriteLine("Number as string: " + numberString);

    // Σύγκριση αριθμών

    int comparisonResult = number.CompareTo(456);
    Console.WriteLine("Comparison result: " + comparisonResult);
}
}

Παραδείγματα Χρήσης

Ακολουθεί ένα παράδειγμα που δείχνει κάποιες από τις μεθόδους της κλάσης Int32:

using System;

class Program
{
    static void Main()
    {
        // Χρήση της μεθόδου Parse
        int number = Int32.Parse("123");
        Console.WriteLine("Parsed number: " + number);

        // Χρήση της μεθόδου TryParse
        bool success = Int32.TryParse("456", out int parsedNumber);
        if (success)
        {
            Console.WriteLine("Parsed number with TryParse: " + parsedNumber);
        }
        else
        {
            Console.WriteLine("Failed to parse the number.");
        }

        // Χρήση της μεθόδου ToString
        string numberString = Int32.ToString(789);
        Console.WriteLine("Number as string: " + numberString);

        // Χρήση της μεθόδου Compare
        int comparisonResult = Int32.Compare(100, 200);
        Console.WriteLine("Comparison result: " + comparisonResult);

        // Χρήση των ιδιοτήτων MaxValue και MinValue
        Console.WriteLine("MaxValue: " + Int32.MaxValue);
        Console.WriteLine("MinValue: " + Int32.MinValue);

        // Χρήση της μεθόδου GetTypeCode
        TypeCode typeCode = ((IConvertible)number).GetTypeCode();
        Console.WriteLine("TypeCode: " + typeCode);
    }
}

Τύπος double (Δεκαδικός αριθμός)

Αντικειμενοστραφή Προσέγγιση:

Ο τύπος double είναι επίσης δομημένος τύπος, και μπορείς να χρησιμοποιήσεις την κλάση Double για να αλληλεπιδράσεις με δεκαδικούς αριθμούς σαν αντικείμενα.

Ιδιότητες και Μέθοδοι:

IsNaN(): Ελέγχει αν ο αριθμός είναι “Not-a-Number” (NaN).

Μέθοδοι:

ToString(): Μετατρέπει τον δεκαδικό αριθμό σε συμβολοσειρά.

Παράδειγμα:

using System;

class Program
{
static void Main()
{
double value = 123.45;

// Χρήση της μεθόδου ToString

    string valueString = value.ToString();
    Console.WriteLine("Value as string: " + valueString);

    // Έλεγχος αν είναι NaN

    bool isNaN = Double.IsNaN(value);
    Console.WriteLine("Is NaN: " + isNaN);
}
}

Τύπος bool (Λογική τιμή)

Αντικειμενοστραφή Προσέγγιση:

Ο τύπος bool αναπαριστά λογικές τιμές (αληθές ή ψευδές) και μπορείς να χρησιμοποιήσεις την κλάση Boolean για να αλληλεπιδράσεις μαζί του σαν αντικείμενο.

Ιδιότητες και Μέθοδοι:

ToString(): Μετατρέπει τη λογική τιμή σε συμβολοσειρά (“True” ή “False”).

Μέθοδοι:

0. ToString(): Μετατρέπει τη λογική τιμή σε συμβολοσειρά (“True” ή “False”).

  1. ToString(string format)
    • Μετατρέπει την τιμή του double σε συμβολοσειρά με βάση μια καθορισμένη μορφή (format).
    • Παράδειγμα: string str = myDouble.ToString("F2"); // Μορφή με 2 δεκαδικά ψηφία
  2. ToString(IFormatProvider provider)
    • Μετατρέπει την τιμή του double σε συμβολοσειρά με βάση μια καθορισμένη τοπική ρύθμιση (format provider).
    • Παράδειγμα: string str = myDouble.ToString(CultureInfo.InvariantCulture);
  3. ToString(string format, IFormatProvider provider)
    • Μετατρέπει την τιμή του double σε συμβολοσειρά με βάση μια καθορισμένη μορφή και τοπική ρύθμιση.
    • Παράδειγμα: string str = myDouble.ToString("E", CultureInfo.InvariantCulture); // Επιστρέφει σε επιστημονική μορφή
  4. IsNaN(double d)
    • Ελέγχει αν ο αριθμός είναι “Not-a-Number” (NaN).
    • Παράδειγμα: bool isNaN = Double.IsNaN(myDouble);
  5. IsInfinity(double d)
    • Ελέγχει αν ο αριθμός είναι είτε θετική είτε αρνητική απειροσύνη.
    • Παράδειγμα: bool isInfinity = Double.IsInfinity(myDouble);
  6. IsPositiveInfinity(double d)
    • Ελέγχει αν ο αριθμός είναι θετική απειροσύνη.
    • Παράδειγμα: bool isPositiveInfinity = Double.IsPositiveInfinity(myDouble);
  7. IsNegativeInfinity(double d)
    • Ελέγχει αν ο αριθμός είναι αρνητική απειροσύνη.
    • Παράδειγμα: bool isNegativeInfinity = Double.IsNegativeInfinity(myDouble);
  8. Compare(double x, double y)
    • Συγκρίνει δύο δεκαδικούς αριθμούς double και επιστρέφει έναν ακέραιο αριθμό που δείχνει αν ο πρώτος αριθμός είναι μικρότερος, ίσος ή μεγαλύτερος από τον δεύτερο.
    • Παράδειγμα: int comparison = Double.Compare(x, y);

Παράδειγμα:

using System;

class Program
{
    static void Main()
    {
        bool isTrue = true;
        
        // Χρήση της μεθόδου ToString

        string booleanString = isTrue.ToString();

        Console.WriteLine("Boolean as string: " + booleanString);

    }
}

Παράδειγμα Χρήσης

using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        double myDouble = 123.456;
        
        // Χρήση της μεθόδου ToString
        string defaultString = myDouble.ToString();
        Console.WriteLine("Default ToString: " + defaultString);

        // Χρήση της μεθόδου ToString με μορφή
        string formattedString = myDouble.ToString("F2");
        Console.WriteLine("Formatted ToString (F2): " + formattedString);

        // Χρήση της μεθόδου ToString με IFormatProvider
        string cultureString = myDouble.ToString(CultureInfo.InvariantCulture);
        Console.WriteLine("ToString with InvariantCulture: " + cultureString);

        // Χρήση της μεθόδου IsNaN
        bool isNaN = Double.IsNaN(myDouble);
        Console.WriteLine("Is NaN: " + isNaN);

        // Χρήση της μεθόδου IsInfinity
        bool isInfinity = Double.IsInfinity(myDouble);
        Console.WriteLine("Is Infinity: " + isInfinity);

        // Χρήση της μεθόδου Compare
        double anotherDouble = 456.789;
        int comparisonResult = Double.Compare(myDouble, anotherDouble);
        Console.WriteLine("Comparison result: " + comparisonResult);

        // Χρήση των ιδιοτήτων MaxValue και MinValue
        Console.WriteLine("MaxValue: " + Double.MaxValue);
        Console.WriteLine("MinValue: " + Double.MinValue);
        
        // Χρήση των ιδιοτήτων PositiveInfinity και NegativeInfinity
        Console.WriteLine("PositiveInfinity: " + Double.PositiveInfinity);
        Console.WriteLine("NegativeInfinity: " + Double.NegativeInfinity);
    }
}

Σημαντικές Σημειώσεις

  • Value Types vs. Reference Types: Αν και οι double τιμές είναι value types, η C# παρέχει τη δυνατότητα χρήσης τους με παρόμοιο τρόπο όπως τα αντικείμενα μέσω της κλάσης Double. Αυτό σημαίνει ότι μπορείς να χρησιμοποιήσεις μεθόδους της κλάσης Double για να κάνεις πράγματα με δεκαδικούς αριθμούς.

  • Precision and Representation: Επειδή ο τύπος double χρησιμοποιεί κινητή υποδιαστολή, η αναπαράσταση και η ακριβής ακρίβεια των αριθμών μπορεί να επηρεαστεί από την εσωτερική αναπαράσταση του τύπου.

Τύπος char (Χαρακτήρας)

Αντικειμενοστραφή Προσέγγιση:

Ο τύπος char αναπαριστά έναν μόνο χαρακτήρα και μπορείς να χρησιμοποιήσεις την κλάση Char για να αλληλεπιδράσεις με χαρακτήρες σαν αντικείμενα.

Ιδιότητες και Μέθοδοι:

  • Μέθοδοι:

  • ToString(): Μετατρέπει τον χαρακτήρα σε συμβολοσειρά.

  • Ιδιότητες και Μέθοδοι της Κλάσης Char

  • MaxValue
    • Επιστρέφει τον μεγαλύτερο χαρακτήρα Unicode που μπορεί να έχει ένας χαρακτήρας char ('\uFFFF').
    • Παράδειγμα: char max = Char.MaxValue;

  • MinValue
    • Επιστρέφει τον μικρότερο χαρακτήρα Unicode που μπορεί να έχει ένας χαρακτήρας char ('\u0000').
    • Παράδειγμα: char min = Char.MinValue;

  • IsDigit(char c)
    • Ελέγχει αν ο χαρακτήρας είναι ψηφίο.
    • Παράδειγμα: bool isDigit = Char.IsDigit('5');

  • IsLetter(char c)
    • Ελέγχει αν ο χαρακτήρας είναι γράμμα.
    • Παράδειγμα: bool isLetter = Char.IsLetter('A');

  • IsWhiteSpace(char c)
    • Ελέγχει αν ο χαρακτήρας είναι κενό διάστημα ή άλλος λευκός χαρακτήρας (space, tab κ.λπ.).
    • Παράδειγμα: bool isWhiteSpace = Char.IsWhiteSpace(' ');

  • IsUpper(char c)
    • Ελέγχει αν ο χαρακτήρας είναι κεφαλαίο γράμμα.
    • Παράδειγμα: bool isUpper = Char.IsUpper('A');

  • IsLower(char c)
    • Ελέγχει αν ο χαρακτήρας είναι πεζό γράμμα.
    • Παράδειγμα: bool isLower = Char.IsLower('a');

  • IsPunctuation(char c)
    • Ελέγχει αν ο χαρακτήρας είναι σημάδι στίξης.
    • Παράδειγμα: bool isPunctuation = Char.IsPunctuation('.');

  • IsLetterOrDigit(char c)
    • Ελέγχει αν ο χαρακτήρας είναι γράμμα ή ψηφίο.
    • Παράδειγμα: bool isLetterOrDigit = Char.IsLetterOrDigit('9');

  • ToUpper(char c)
    • Μετατρέπει τον χαρακτήρα σε κεφαλαίο γράμμα αν είναι πεζό.
    • Παράδειγμα: char upper = Char.ToUpper('a');

  • ToLower(char c)
    • Μετατρέπει τον χαρακτήρα σε πεζό γράμμα αν είναι κεφαλαίο.
    • Παράδειγμα: char lower = Char.ToLower('A');

  • GetUnicodeCategory(char c)
    • Επιστρέφει την κατηγορία Unicode του χαρακτήρα.
    • Παράδειγμα: UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory('A');

Παράδειγμα:

using System;

class Program
{
    static void Main()
    {
        char letter = 'A';
        
        // Χρήση της μεθόδου ToString

        string letterString = letter.ToString();
        Console.WriteLine("Char as string: " + letterString);
        
        // Έλεγχος αν είναι ψηφίο

        bool isDigit = Char.IsDigit(letter);
        Console.WriteLine("Is digit: " + isDigit);
    }
}

Παράδειγμα Χρήσης

   using System;
using System.Globalization;

class Program
{
static void Main()
{
char myChar = 'a';

 // Χρήση της ιδιότητας MaxValue και MinValue

    Console.WriteLine("MaxValue: " + Char.MaxValue);
    Console.WriteLine("MinValue: " + Char.MinValue);


    // Χρήση της μεθόδου IsDigit

    bool isDigit = Char.IsDigit('5');
    Console.WriteLine("Is '5' a digit: " + isDigit);


    // Χρήση της μεθόδου IsLetter
    bool isLetter = Char.IsLetter('A');

    Console.WriteLine("Is 'A' a letter: " + isLetter);


    // Χρήση της μεθόδου IsWhiteSpace

    bool isWhiteSpace = Char.IsWhiteSpace(' ');

    Console.WriteLine("Is space a whitespace: " + isWhiteSpace);

    // Χρήση της μεθόδου IsUpper
    bool isUpper = Char.IsUpper(myChar);
    Console.WriteLine("Is 'a' uppercase: " + isUpper);

    // Χρήση της μεθόδου IsLower

    bool isLower = Char.IsLower(myChar);
    Console.WriteLine("Is 'a' lowercase: " + isLower);

    // Χρήση της μεθόδου IsPunctuation

    bool isPunctuation = Char.IsPunctuation('!');
    Console.WriteLine("Is '!' punctuation: " + isPunctuation);

    // Χρήση της μεθόδου IsLetterOrDigit

    bool isLetterOrDigit = Char.IsLetterOrDigit('9');


    Console.WriteLine("Is '9' a letter or digit: " + isLetterOrDigit);

    // Χρήση της μεθόδου ToUpper

    char upperChar = Char.ToUpper(myChar);
    Console.WriteLine("Uppercase of 'a': " + upperChar);

    // Χρήση της μεθόδου ToLower
    char lowerChar = Char.ToLower('A');
    Console.WriteLine("Lowercase of 'A': " + lowerChar);
}
}

Σημαντικές Σημειώσεις

  • Value Types vs. Reference Types: Παρόλο που ο char είναι value type, η κλάση Char παρέχει χρήσιμες μεθόδους που σας επιτρέπουν να αλληλεπιδράτε με χαρακτήρες με τρόπους που είναι συνήθως διαθέσιμοι σε reference types.

  • Unicode: Ο τύπος char υποστηρίζει τη διεθνή αναπαράσταση χαρακτήρων μέσω Unicode, γεγονός που επιτρέπει την αναπαράσταση σχεδόν όλων των χαρακτήρων που χρησιμοποιούνται σε διάφορες γλώσσες και σύμβολα.

Τύπος string (Συμβολοσειρά).

Αντικειμενοστραφή Προσέγγιση:

Ο τύπος string αναπαριστά μια ακολουθία χαρακτήρων και μπορείς να χρησιμοποιήσεις την κλάση String για να αλληλεπιδράσεις με συμβολοσειρές σαν αντικείμενα.

Ιδιότητες και Μέθοδοι:

  • Μέθοδοι:
    • Length: Επιστρέφει το μήκος της συμβολοσειράς.

  1. ToUpper()
    • Επιστρέφει μια νέα συμβολοσειρά όπου όλοι οι χαρακτήρες είναι κεφαλαίοι.
    • Παράδειγμα: string upper = myString.ToUpper();

  1. ToLower()
    • Επιστρέφει μια νέα συμβολοσειρά όπου όλοι οι χαρακτήρες είναι πεζοί.
    • Παράδειγμα: string lower = myString.ToLower();

  1. Trim()
    • Επιστρέφει μια νέα συμβολοσειρά με τα κενά διαστήματα που βρίσκονται στην αρχή και στο τέλος της αρχικής συμβολοσειράς αφαιρεμένα.
    • Παράδειγμα: string trimmed = myString.Trim();

  1. Substring(int startIndex, int length)
    • Επιστρέφει μια υποσυμβολοσειρά που αρχίζει από την θέση startIndex και έχει μήκος length.
    • Παράδειγμα: string sub = myString.Substring(5, 10);

  1. IndexOf(string value)
    • Επιστρέφει τη θέση της πρώτης εμφάνισης της υποσυμβολοσειράς value στην αρχική συμβολοσειρά. Επιστρέφει -1 αν η υποσυμβολοσειρά δεν βρεθεί.
    • Παράδειγμα: int index = myString.IndexOf("test");

  1. LastIndexOf(string value)
    • Επιστρέφει τη θέση της τελευταίας εμφάνισης της υποσυμβολοσειράς value στην αρχική συμβολοσειρά.
    • Παράδειγμα: int lastIndex = myString.LastIndexOf("test");

  1. Replace(string oldValue, string newValue)
    • Επιστρέφει μια νέα συμβολοσειρά με όλες τις εμφανίσεις της υποσυμβολοσειράς oldValue αντικατεστημένες με newValue.
    • Παράδειγμα: string replaced = myString.Replace("old", "new");

  1. Split(char separator)
    • Διαχωρίζει τη συμβολοσειρά σε έναν πίνακα συμβολοσειρών χρησιμοποιώντας το χαρακτήρα διαχωρισμού separator.
    • Παράδειγμα: string[] parts = myString.Split(',');

  1. StartsWith(string value)
    • Ελέγχει αν η συμβολοσειρά αρχίζει με την υποσυμβολοσειρά value.
    • Παράδειγμα: bool starts = myString.StartsWith("start");

  1. EndsWith(string value)
    • Ελέγχει αν η συμβολοσειρά τελειώνει με την υποσυμβολοσειρά value.
    • Παράδειγμα: bool ends = myString.EndsWith("end");

  1. Contains(string value)
    • Ελέγχει αν η συμβολοσειρά περιέχει την υποσυμβολοσειρά value.
    • Παράδειγμα: bool contains = myString.Contains("sub");

  1. Insert(int startIndex, string value)
    • Επιστρέφει μια νέα συμβολοσειρά με την υποσυμβολοσειρά value εισαχθεί στην θέση startIndex.
    • Παράδειγμα: string inserted = myString.Insert(5, "inserted");

  1. Remove(int startIndex, int count)
    • Επιστρέφει μια νέα συμβολοσειρά με τα count χαρακτήρες αφαιρεμένους που ξεκινούν από τη θέση startIndex.
    • Παράδειγμα: string removed = myString.Remove(5, 3);

  1. Format(string format, object arg0)
    • Δημιουργεί μια νέα συμβολοσειρά με αντικατάσταση θέσεων βασισμένη στη μορφή format και στις τιμές των arg0, arg1, κ.λπ.
    • Παράδειγμα: string formatted = String.Format("Hello, {0}!", "world");

  1. Join(string separator, params string[] values)
    • Συνδέει μια σειρά από συμβολοσειρές χρησιμοποιώντας το διαχωριστικό separator.
    • Παράδειγμα: string joined = String.Join(", ", "apple", "banana", "cherry");

  1. ToCharArray()
    • Μετατρέπει τη συμβολοσειρά σε πίνακα χαρακτήρων.
    • Παράδειγμα: char[] charArray = myString.ToCharArray();

Παράδειγμα:

using System;

class Program
{
    static void Main()
    {
        string text = "Hello, World!";
        
        // Χρήση της ιδιότητας Length

        int length = text.Length;
        Console.WriteLine("Length of the string: " + length);
        
        // Χρήση της μεθόδου Substring

        string substring = text.Substring(7, 5);
        Console.WriteLine("Substring: " + substring);
        

        // Μετατροπή σε κεφαλαία

        string upperText = text.ToUpper();
        Console.WriteLine("Upper case: " + upperText);
    }
}

Παράδειγμα Χρήσης

   using System;

class Program
{
static void Main()
{
string myString = " Hello, world! ";
 // Χρήση της ιδιότητας Length
    int length = myString.Length;
    Console.WriteLine("Length: " + length);

    // Χρήση της ιδιότητας Empty
    string emptyString = String.Empty;
    Console.WriteLine("Empty String: '" + emptyString + "'");

    // Χρήση της μεθόδου ToUpper
    string upperString = myString.ToUpper();
    Console.WriteLine("ToUpper: " + upperString);

    // Χρήση της μεθόδου ToLower
    string lowerString = myString.ToLower();
    Console.WriteLine("ToLower: " + lowerString);

    // Χρήση της μεθόδου Trim
    string trimmedString = myString.Trim();
    Console.WriteLine("Trimmed: '" + trimmedString + "'");

    // Χρήση της μεθόδου Substring
    string subString = myString.Substring(7, 5);
    Console.WriteLine("Substring (7, 5): " + subString);

    // Χρήση της μεθόδου IndexOf
    int index = myString.IndexOf("world");
    Console.WriteLine("IndexOf 'world': " + index);

    // Χρήση της μεθόδου LastIndexOf
    int lastIndex = myString.LastIndexOf("o");
    Console.WriteLine("LastIndexOf 'o': " + lastIndex);

    // Χρήση της μεθόδου Replace
    string replacedString = myString.Replace("world", "CSharp");
    Console.WriteLine("Replace 'world' with 'CSharp': " + replacedString);

    // Χρήση της μεθόδου Split
    string[] parts = myString.Split(',');
    Console.WriteLine("Split by ',':");
    foreach (string part in parts)
    {
        Console.WriteLine(part);
    }

    // Χρήση της μεθόδου StartsWith
    bool startsWith = myString.StartsWith("   Hello");
    Console.WriteLine("StartsWith '   Hello': " + startsWith);

    // Χρήση της μεθόδου EndsWith
    bool endsWith = myString.EndsWith("world!   ");
    Console.WriteLine("EndsWith 'world!   ': " + endsWith);

    // Χρήση της μεθόδου Contains
    bool contains = myString.Contains("world");
    Console.WriteLine("Contains 'world': " + contains);

    // Χρήση της μεθόδου Insert
    string insertedString = myString.Insert(5, " dear");
    Console.WriteLine("Insert ' dear' at index 5: " + insertedString);

    // Χρήση της μεθόδου Remove
    string removedString = myString.Remove(5, 7);
    Console.WriteLine("Remove 7 characters from index 5: " + removedString);

    // Χρήση της μεθόδου Format
    string formattedString = String.Format("Hello, {0}!", "world");
    Console.WriteLine("Formatted: " + formattedString);

    // Χρήση της μεθόδου Join
    string joinedString = String.Join(", ", "apple", "banana", "cherry");
    Console.WriteLine("Joined: " + joinedString);

    // Χρήση της μεθόδου ToCharArray
    char[] charArray = myString.ToCharArray();
    Console.WriteLine("ToCharArray:");
    foreach (char c in charArray)
    {
        Console.Write(c + " ");
    }
    Console.WriteLine();
}
}

Σημαντικές Σημειώσεις

  • Immutability: Οι συμβολοσειρές στην C# είναι αμετάβλητες (immutable), πράγμα που σημαίνει ότι όταν τροποποιείς μια συμβολοσειρά, στην πραγματικότητα δημιουργείς μια νέα συμβολοσειρά. Η αρχική συμβολοσειρά παραμένει αμετάβλητη.

  • Performance Considerations: Για συχνές και πολλές τροποποιήσεις σε συμβολοσειρές, μπορεί να είναι πιο αποδοτικό να χρησιμοποιήσεις τη κλάση StringBuilder, η οποία είναι σχεδιασμένη για να επιτρέπει επεξεργασία συμβολοσειρών με πιο αποδοτικό τρόπο.

Τύποι Συλλογών

Λίστες (List<T>):

Η κλάση List<T> ανήκει στο namespace System.Collections.Generic και αναπαριστά μια συλλογή που μπορεί να αποθηκεύσει πολλαπλά αντικείμενα του τύπου T.

Ιδιότητες και Μέθοδοι:

  • Μέθοδοι:
    • Add(T item): Προσθέτει ένα αντικείμενο στη λίστα.
    • Remove(T item): Αφαιρεί ένα αντικείμενο από τη λίστα.

  • Count: Επιστρέφει τον αριθμό των αντικειμένων στη λίστα.

Παράδειγμα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> names = new List<string>();
        
        // Προσθήκη στοιχείων στη λίστα
        names.Add("Alice");
        names.Add("Bob");
        
        // Εμφάνιση όλων των στοιχείων της λίστας
        foreach (var name in names)
        {
            Console.WriteLine(name);
        }
        
        // Αφαίρεση στοιχείου από τη λίστα
        names.Remove("Bob");
        Console.WriteLine("After removing Bob:");
        foreach (var name in names)
        {
            Console.WriteLine(name);
        }
    }
}

Στην C#, οι συλλογές (collections) είναι τύποι δεδομένων που επιτρέπουν την αποθήκευση και διαχείριση ομάδων αντικειμένων. Υπάρχουν διάφοροι τύποι συλλογών, καθένας με τις δικές του χρήσεις και χαρακτηριστικά. Οι πιο κοινές συλλογές περιλαμβάνουν πίνακες (arrays), List<T>, Dictionary<TKey, TValue>, HashSet<T>, και Queue<T>, μεταξύ άλλων. Ακολουθεί μια περιγραφή των βασικών τύπων συλλογών και των μεθόδων και ιδιοτήτων τους:

1. Πίνακες (Arrays)

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

Ιδιότητες και Μέθοδοι

  • Length
    • Επιστρέφει τον αριθμό των στοιχείων στον πίνακα.
    • Παράδειγμα: int length = myArray.Length;
  • GetLength(int dimension)
    • Επιστρέφει το μήκος μιας συγκεκριμένης διάστασης του πίνακα (για πολυδιάστατους πίνακες).
    • Παράδειγμα: int length = myArray.GetLength(0);
  • CopyTo(Array array, int index)
    • Αντιγράφει τα στοιχεία του πίνακα σε έναν άλλον πίνακα, ξεκινώντας από τη θέση index.
    • Παράδειγμα: myArray.CopyTo(otherArray, 0);
  • Clone()
    • Δημιουργεί ένα αντίγραφο του πίνακα.
    • Παράδειγμα: Array clone = myArray.Clone();

2. List<T>

Η κλάση List<T> είναι μια δυναμική συλλογή που επιτρέπει την αποθήκευση και διαχείριση στοιχείων του τύπου T. Αυτή η συλλογή μπορεί να αλλάξει μέγεθος κατά την εκτέλεση.

Ιδιότητες και Μέθοδοι

  • Count
    • Επιστρέφει τον αριθμό των στοιχείων στη λίστα.
    • Παράδειγμα: int count = myList.Count;

  • Add(T item)
    • Προσθέτει ένα στοιχείο στο τέλος της λίστας.
    • Παράδειγμα: myList.Add(42);

  • Remove(T item)
    • Αφαιρεί το πρώτο εμφανιζόμενο στοιχείο από τη λίστα που είναι ίσο με item.
    • Παράδειγμα: myList.Remove(42);

  • Insert(int index, T item)
    • Εισάγει το στοιχείο item στη θέση index.
    • Παράδειγμα: myList.Insert(1, 99);

  • Contains(T item)
    • Ελέγχει αν η λίστα περιέχει το στοιχείο item.
    • Παράδειγμα: bool contains = myList.Contains(42);

  • Sort()
    • Ταξινομεί τα στοιχεία της λίστας.
    • Παράδειγμα: myList.Sort();

  • Clear()
    • Αφαιρεί όλα τα στοιχεία από τη λίστα.
    • Παράδειγμα: myList.Clear();

3. Dictionary<TKey, TValue>

Η κλάση Dictionary<TKey, TValue> είναι μια συλλογή ζευγών κλειδιών-τιμών, όπου το κάθε κλειδί είναι μοναδικό και σχετίζεται με μία τιμή.

Ιδιότητες και Μέθοδοι

  • Count
    • Επιστρέφει τον αριθμό των ζευγών κλειδιών-τιμών στο λεξικό.
    • Παράδειγμα: int count = myDictionary.Count;

  • Add(TKey key, TValue value)
    • Προσθέτει ένα νέο ζευγάρι κλειδιού-τιμής στο λεξικό.
    • Παράδειγμα: myDictionary.Add("key", "value");

  • Remove(TKey key)
    • Αφαιρεί το ζευγάρι κλειδιού-τιμής που αντιστοιχεί στο key.
    • Παράδειγμα: myDictionary.Remove("key");

  • TryGetValue(TKey key, out TValue value)
    • Επιστρέφει την τιμή που σχετίζεται με το key αν το κλειδί υπάρχει στο λεξικό.
    • Παράδειγμα: bool found = myDictionary.TryGetValue("key", out var value);

  • ContainsKey(TKey key)
    • Ελέγχει αν το λεξικό περιέχει το κλειδί key.
    • Παράδειγμα: bool containsKey = myDictionary.ContainsKey("key");
  • Clear()
    • Αφαιρεί όλα τα ζεύγη κλειδιών-τιμών από το λεξικό.
    • Παράδειγμα: myDictionary.Clear();

4. HashSet<T>

Η κλάση HashSet<T> είναι μια συλλογή που δεν επιτρέπει επαναλαμβανόμενα στοιχεία και βασίζεται σε hash για γρήγορη αναζήτηση.

Ιδιότητες και Μέθοδοι

  • Count
    • Επιστρέφει τον αριθμό των στοιχείων στο HashSet.
    • Παράδειγμα: int count = myHashSet.Count;

  • Add(T item)
    • Προσθέτει το στοιχείο item στο HashSet αν δεν υπάρχει ήδη.
    • Παράδειγμα: bool added = myHashSet.Add(42);

  • Remove(T item)
    • Αφαιρεί το στοιχείο item από το HashSet.
    • Παράδειγμα: bool removed = myHashSet.Remove(42);

  • Contains(T item)
    • Ελέγχει αν το HashSet περιέχει το στοιχείο item.
    • Παράδειγμα: bool contains = myHashSet.Contains(42);

  • Clear()
    • Αφαιρεί όλα τα στοιχεία από το HashSet.
    • Παράδειγμα: myHashSet.Clear();

5. Queue<T>

Η κλάση Queue<T> είναι μια συλλογή που ακολουθεί τη λογική FIFO (First In, First Out), όπου τα στοιχεία προστίθενται στο τέλος και αφαιρούνται από την αρχή.

Ιδιότητες και Μέθοδοι

  • Count
    • Επιστρέφει τον αριθμό των στοιχείων στη Queue.
    • Παράδειγμα: int count = myQueue.Count;

  • Enqueue(T item)
    • Προσθέτει το στοιχείο item στο τέλος της Queue.
    • Παράδειγμα: myQueue.Enqueue(42);

  • Dequeue()
    • Αφαιρεί και επιστρέφει το στοιχείο από την αρχή της Queue.
    • Παράδειγμα: int item = myQueue.Dequeue();

  • Peek()
    • Επιστρέφει το στοιχείο στην αρχή της Queue χωρίς να το αφαιρέσει.
    • Παράδειγμα: int item = myQueue.Peek();
  • Clear()
    • Αφαιρεί όλα τα στοιχεία από την Queue.
    • Παράδειγμα: myQueue.Clear();

6. Stack<T>

Η κλάση Stack<T> είναι μια συλλογή που ακολουθεί τη λογική LIFO (Last In, First Out), όπου τα στοιχεία προστίθενται και αφαιρούνται από την κορυφή της στοίβας.

Ιδιότητες και Μέθοδοι

  • Count
    • Επιστρέφει τον αριθμό των στοιχείων στη Stack.
    • Παράδειγμα: int count = myStack.Count;

  • Push(T item)
    • Προσθέτει το στοιχείο item στην κορυφή της Stack.
    • Παράδειγμα: myStack.Push(42);

  • Pop()
    • Αφαιρεί και επιστρέφει το στοιχεί

Παράδειγμα Χρήσης Συλλογών

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

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Χρήση πίνακα
        int[] myArray = { 1, 2, 3, 4, 5 };
        Console.WriteLine("Array Length: " + myArray.Length);

        // Χρήση List<T>
        List<int> myList = new List<int> { 1, 2, 3 };
        myList.Add(4);
        myList.Remove(2);
        Console.WriteLine("List Count: " + myList.Count);

        // Χρήση Dictionary<TKey, TValue>
        Dictionary<string, int> myDictionary = new Dictionary<string, int>();
        myDictionary.Add("apple", 1);
        myDictionary.Add("banana", 2);
        Console.WriteLine("Dictionary Contains 'apple': " + myDictionary.ContainsKey("apple"));

        // Χρήση HashSet<T>
        HashSet<int> myHashSet = new HashSet<int> { 1, 2, 3 };
        myHashSet.Add(4);
        Console.WriteLine("HashSet Contains 2: " + myHashSet.Contains(2));

        // Χρήση Queue<T>
        Queue<int> myQueue = new Queue<int>();
        myQueue.Enqueue(1);
        myQueue.Enqueue(2);
        Console.WriteLine("Queue Dequeue: " + myQueue.Dequeue());

        // Χρήση Stack<T>
        Stack<int> myStack = new Stack<int>();
        myStack.Push(1);
        myStack.Push(2);
        Console.WriteLine("Stack Peek: " + myStack.Peek());
    }
}

Σημαντικές Σημειώσεις

  • Επιλογή Συλλογών: Η επιλογή της κατάλληλης συλλογής εξαρτάται από τις απαιτήσεις της εφαρμογής, όπως η ανάγκη για γρήγορη αναζήτηση, η αποδοτικότητα προσθέτων/αφαιρέσεων, και η σειρά διαχείρισης των στοιχείων.

  • Performance Considerations: Κάθε τύπος συλλογής έχει διαφορετικά χαρακτηριστικά απόδοσης για τις διάφορες λειτουργίες, γι’ αυτό είναι σημαντικό να κατανοήσεις τις επιδόσεις και τα χαρακτηριστικά τους για να επιλέξεις τη σωστή συλλογή για κάθε περίπτωση.

NULLABLE ΜΕΤΑΒΛΗΤΕΣ: Nullable Value Types

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

1. Nullable Reference Types (Nullable Αναφορές)

Από την C# 8.0 και μετά, μπορούμε να δηλώσουμε αναφορές τύπου (όπως `string`, `object`, κ.λπ.) ως nullable χρησιμοποιώντας το σύμβολο `?`.

string? name = null;

object? myObject = null;

2. Nullable Value Types (Nullable Τύποι Τιμών)

Για τύπους τιμών (όπως `int`, `double`, κ.λπ.), χρησιμοποιούμε επίσης το σύμβολο `?`.

Αυτό επιτρέπει στους τύπους τιμών να παίρνουν την τιμή `null`.

int? age = null;

double? height = null;

bool? isAvailable = null;


3. Χρήση Nullable Τύπων

Όταν εργαζόμαστε με nullable τύπους, μπορούμε να ελέγχουμε αν έχουν τιμή πριν τους χρησιμοποιήσουμε:

int? age = null;

if (age.HasValue)

{

    Console.WriteLine($”Age: {age.Value}”);

}

else

{

    Console.WriteLine(“Age is not set.”);

}

Μπορούμε επίσης να χρησιμοποιήσουμε τον τελεστή null-coalescing (`??`) για να ορίσουμε μια προεπιλεγμένη τιμή όταν η nullable μεταβλητή είναι `null`:

int? age = null;

int defaultAge = age ?? 0; // Αν age είναι null, defaultAge θα είναι 0

4. Παράδειγμα Σύνθεσης Nullable Τύπων

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

class Program

{

    static void Main(string[] args)

    {

        string? name = null;

        int? age = null;

        if (name == null)

        {

            Console.WriteLine(“Name is not set.”);

        }

        else

        {

            Console.WriteLine($”Name: {name}”);

        }

        age = 25; // Ορίζουμε την ηλικία

        if (age.HasValue)

        {

            Console.WriteLine($”Age: {age.Value}”);

        }

        else

        {

            Console.WriteLine(“Age is not set.”);

        }

        // Χρήση του null-coalescing τελεστή

        int finalAge = age ?? 0;

        Console.WriteLine($”Final Age: {finalAge}”);

    }

}

Σύνοψη

– Nullable Reference Types**: Χρησιμοποιούμε το `?` μετά τον τύπο για αναφορές (π.χ., `string?`).

– Nullable Value Types**: Χρησιμοποιούμε το `?` μετά τον τύπο για τιμές (π.χ., `int?`).

– Έλεγχος Τιμών**: Χρησιμοποιούμε την ιδιότητα `HasValue` και την ιδιότητα `Value` για να ελέγχουμε και να αποκτούμε την τιμή.

– Null-coalescing Τελεστής**: Χρησιμοποιούμε τον τελεστή `??` για να ορίσουμε προεπιλεγμένες τιμές.

Αυτές οι δυνατότητες επιτρέπουν την καλύτερη διαχείριση των περιπτώσεων όπου οι τιμές μπορεί να είναι `null`, αυξάνοντας την ευελιξία και την ασφάλεια του κώδικά μας.

χρήση ιδιωτικών (private) μεταβλητών

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

Αυτή η πρακτική προσφέρει πολλαπλά οφέλη:

1. Έλεγχος Πρόσβασης:

   – Καθιστώντας τις μεταβλητές ιδιωτικές (private), μπορείς να ελέγχεις ποιος και πώς μπορεί να τις αλλάξει. Αυτό αποτρέπει την άμεση τροποποίηση των δεδομένων από εξωτερικές κλάσεις ή κώδικα, προστατεύοντας την ακεραιότητα των δεδομένων.

2. Συντήρηση και Επέκταση:

   – Αν οι μεταβλητές είναι δημόσιες (public), κάθε αλλαγή στη δομή τους μπορεί να σπάσει τον κώδικα που τις χρησιμοποιεί. Με τη χρήση μεθόδων (getters και setters), μπορείς να αλλάξεις την εσωτερική αναπαράσταση των δεδομένων χωρίς να επηρεάσεις τον κώδικα που χρησιμοποιεί την κλάση.

3. Επικύρωση Δεδομένων:

   – Χρησιμοποιώντας μεθόδους για να θέσεις τιμές (setters), μπορείς να προσθέσεις λογική επικύρωσης για να βεβαιωθείς ότι τα δεδομένα είναι έγκυρα πριν αποθηκευτούν. Για παράδειγμα, μπορείς να ελέγξεις ότι η ηλικία ενός ατόμου είναι θετικός αριθμός πριν την αποθηκεύσεις.

4. Απόκρυψη Πληροφοριών:

   – Η ενθυλάκωση βοηθά στην απόκρυψη της εσωτερικής πολυπλοκότητας και μόνο οι απαραίτητες λεπτομέρειες εκτίθενται μέσω της δημόσιας διεπαφής της κλάσης. Αυτό διευκολύνει τη χρήση της κλάσης χωρίς να χρειάζεται να γνωρίζεις την εσωτερική της λειτουργία.

5. Αρχή της Ενιαίας Ευθύνης:

   – Η ενθυλάκωση υποστηρίζει την αρχή της ενιαίας ευθύνης (Single Responsibility Principle). Η κλάση είναι υπεύθυνη για τη διαχείριση της δικής της κατάστασης και οι εξωτερικές κλάσεις δεν χρειάζεται να γνωρίζουν τις λεπτομέρειες της εσωτερικής της κατάστασης.

Παράδειγμα

Ας δούμε ένα παράδειγμα για να κατανοήσουμε πώς λειτουργεί η ενθυλάκωση στην πράξη:

public class Car

{

    private double speedPerMile;

    private int yearOfBuilding;

    private string model;

    private string manufacturer;

    // Constructor

    public Car(double speedPerMile, int yearOfBuilding, string model, string manufacturer)

    {

        this.speedPerMile = speedPerMile;

        this.yearOfBuilding = yearOfBuilding;

        this.model = model;

        this.manufacturer = manufacturer;

    }

    // Getter for speedPerMile

    public double GetSpeedPerMile()

    {

        return speedPerMile;

    }

    // Setter for speedPerMile with validation

    public void SetSpeedPerMile(double speedPerMile)

    {

        if (speedPerMile > 0)

        {

            this.speedPerMile = speedPerMile;

        }

        else

        {

            throw new ArgumentException(“Speed per mile must be positive.”);

        }

    }

    // Getter for yearOfBuilding

    public int GetYearOfBuilding()

    {

        return yearOfBuilding;

    }

    // Other getters and setters can be added similarly

}

public class Program

{

    public static void Main(string[] args)

    {

        Car car = new Car(2332, 2013, “citroen c2”, “citroen”);

        Console.WriteLine(“Speed per mile: ” + car.GetSpeedPerMile());

        // Update speed per mile with validation

        car.SetSpeedPerMile(3000);

        Console.WriteLine(“Updated speed per mile: ” + car.GetSpeedPerMile());

        // Attempt to set an invalid speed

        try

        {

            car.SetSpeedPerMile(-100);

        }

        catch (ArgumentException ex)

        {

            Console.WriteLine(ex.Message);

        }

    }

}

Σημεία Κλειδιά:

– Ιδιωτικές Μεταβλητές: Οι μεταβλητές `speedPerMile`, `yearOfBuilding`, `model`, και `manufacturer` είναι ιδιωτικές.

– Δημόσιες Μέθοδοι: Παρέχουμε δημόσιες μεθόδους `GetSpeedPerMile` και `SetSpeedPerMile` για την πρόσβαση και την τροποποίηση της τιμής του `speedPerMile`, με προσθήκη λογικής επικύρωσης στη μέθοδο `SetSpeedPerMile`.