Sobes.tech
Junior

Ποιοι τύποι μετατροπής τύπων υπάρχουν σε C#;

sobes.tech AI

Απάντηση από AI

Στη C#, υπάρχουν δύο βασικοί τύποι μετατροπής τύπων: ρητή και μη ρητή.

Ρητή (Implicit) μετατροπή

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

// Ρητή μετατροπή από int σε long
int i = 100;
long l = i;

Ορισμένη (Explicit) μετατροπή

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

// Ορισμένη μετατροπή από double σε int
double d = 123.45;
int i = (int)d; // Το δεκαδικό μέρος απορρίπτεται

// Ορισμένη μετατροπή από object σε string
object obj = "Hello";
string s = (string)obj;

// Χρήση των τελεστών as και is
object objAs = "World";
string sAs = objAs as string; // Επιστρέφει null αν η μετατροπή δεν είναι δυνατή
if (objAs is string) // Ελέγχει αν το αντικείμενο είναι τύπου string
{
    string sIs = (string)objAs;
}

Σύγκριση ορισμένης μετατροπής, as και is

Ενέργεια Περιγραφή Σφάλμα σε αποτυχία
(Τύπος) έκφραση Ορισμένη μετατροπή. Απαιτεί ακριβή αντιστοιχία τύπου. InvalidCastException
έκφραση as Τύπος Προσπαθεί να μετατρέψει τον τύπο. Λειτουργεί μόνο για αναφορικούς τύπους και τύπους που επιτρέπουν null. Επιστρέφει null
έκφραση is Τύπος Ελέγχει αν η έκφραση μπορεί να μετατραπεί στον καθορισμένο τύπο. Αληθές/Ψευδές (true/false)

Προσαρμοσμένες μετατροπές

Ο προγραμματιστής μπορεί να ορίσει δικούς του τελεστές ρητής και μη ρητής μετατροπής για προσαρμοσμένους τύπους, χρησιμοποιώντας τις λέξεις-κλειδιά implicit και explicit.

// Παράδειγμα προσαρμοσμένης μη ρητής μετατροπής
public class Inches
{
    public int Value { get; set; }
    public static implicit operator Millimeters(Inches i)
    {
        return new Millimeters { Value = i.Value * 25 };
    }
}

public class Millimeters
{
    public int Value { get; set; }
}

// Χρήση
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Μη ρητή μετατροπή
// Παράδειγμα προσαρμοσμένης ορισμένης μετατροπής
public class Kilograms
{
    public int Value { get; set; }
}

public class Pounds
{
    public int Value { get; set; }
    public static explicit operator Kilograms(Pounds p)
    {
        return new Kilograms { Value = (int)(p.Value / 2.20462) };
    }
}

// Χρήση
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Ορισμένη μετατροπή