Sobes.tech
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