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; // გამოკვეთილი გადატანა