Junior
Kokie tipų konvertavimo būdai yra C#?
sobes.tech AI
Atsakymas iš AI
C# kalboje yra du pagrindiniai tipų perdavimo būdai: aiškus ir nepastebimas.
Nepastebimas (Implicit) tipų perdavimas
Vyksta automatiškai, kai kompiliatorius įsitikinęs, kad perdavimas yra saugus ir nebus duomenų praradimo. Pavyzdžiui, iš mažesnio diapazono tipo į didesnį.
// Implicitas perdavimas iš int į long
int i = 100;
long l = i;
Aiškus (Explicit) tipų perdavimas
Reikalauja nurodyti perdavimo operatorių ((tipas)) kode ir naudojamas, kai perdavimas gali sukelti duomenų praradimą arba išimtį. Būtina, kai perduodama iš didesnio diapazono tipo į mažesnį arba tarp nesusijusių tipų.
// Aiškus perdavimas iš double į int
double d = 123.45;
int i = (int)d; // dalinė dalis atmetama
// Aiškus perdavimas iš object į string
object obj = "Hello";
string s = (string)obj;
// Naudojant as ir is operatorius
object objAs = "World";
string sAs = objAs as string; // grąžina null, jei perdavimas neįmanomas
if (objAs is string) // tikrina, ar objektas yra string tipas
{
string sIs = (string)objAs;
}
Palyginimas tarp aiškaus perdavimo, as ir is
| Operacija | Aprašymas | Klaida nesėkmės atveju |
|---|---|---|
(Tipas) išraiška |
Aiškus perdavimas. Reikalauja tikslaus tipo atitikimo. | InvalidCastException |
išraiška as Tipas |
Bando perduoti tipą. Veikia tik nuorodų tipams ir tipams, leidžiantiems null. | grąžina null |
išraiška is Tipas |
Patikrina, ar išraiška gali būti perduota į nurodytą tipą. | Boolean reikšmė (true/false) |
Naudotojo apibrėžti perdavimai
Kūrėjas gali apibrėžti savo aiškius ir nepastebimus perdavimo operatorius, naudodamas implicit ir explicit raktinius žodžius.
// Pavyzdys naudotojo apibrėžto nepastebimo perdavimo
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; }
}
// Naudojimas
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Nepastebimas perdavimas
// Naudotojo apibrėžtas aiškus perdavimas
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) };
}
}
// Naudojimas
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Aiškus perdavimas