Sobes.tech
Junior

Koje vrste konverzije tipova postoje u C#?

sobes.tech АИ

Одговор од АИ

У C# постоје две главне врсте кастинга:

  1. Јавни кастинг (Explicit conversion): Захтева коришћење оператора кастинга (тип). Користи се када компајлер не може безбедно аутоматски извршити преобразбу, на пример, када се кастује са основне класе на деривату или са типа веће прецизности на мању (нпр. double у int). Може довести до губитка података или грешке током извршавања (InvalidCastException).

    // Јавни кастинг double у int
    double d = 123.45;
    int i = (int)d; // i ће бити 123
    
    // Јавни кастинг објекта у конкретан тип
    object obj = "Hello";
    string s = (string)obj; // s ће бити "Hello"
    
  2. Непосредни кастинг (Implicit conversion): Аутоматски се извршава од стране компајлера када је преобразба позната и безбедна, односно без губитка података. На пример, када се кастује од int у double.

    // Непосредни кастинг int у double
    int x = 10;
    double y = x; // y ће бити 10.0
    
    // Непосредни кастинг деривате класе у основну
    class Base {}
    class Derived : Base {}
    
    Derived derivedObj = new Derived();
    Base baseObj = derivedObj; // Непосредни кастинг
    

Поред тога, постоје оператори as и is, који такође припадају кастингу, али са својим особеностима:

  • Оператор as: Извршава кастинг ако је могућ, и враћа null ако није. Не генерише изузетак InvalidCastException. Користи се само за референтне типове и типове који дозвољавају Nullable.

    // Коришћење оператора as
    object obj2 = "World";
    string s2 = obj2 as string; // s2 ће бити "World"
    
    object obj3 = 123;
    string s3 = obj3 as string; // s3 ће бити null
    
  • Оператор is: Проверава да ли је објекат инстанца одређеног типа или његовог деривата. Враћа true или false. У најновијим верзијама C# може се користити са шаблонима (pattern matching) за истовремену проверу и кастинг.

    // Коришћење оператора is за проверу типа
    object obj4 = "Example";
    if (obj4 is string)
    {
        // Акције ако је објекат стринг
    }
    
    // Коришћење is са шаблоном (Pattern matching)
    if (obj4 is string str)
    {
        // str је доступан као стринг овде
    }