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; // Բացահայտ փոխակերպում