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; // Ορισμένη μετατροπή