Sobes.tech
Junior

Jakie są rodzaje konwersji typów w C#?

sobes.tech AI

Odpowiedź od AI

W języku C# istnieją dwa główne rodzaje rzutowania typów:

  1. Jawne rzutowanie (Explicit conversion): Wymaga użycia operatora (typ). Używa się go, gdy kompilator nie może bezpiecznie wykonać konwersji automatycznie, na przykład przy rzutowaniu z klasy bazowej na pochodną lub z typu o większej precyzji na typ o mniejszej (np. double na int). Może to prowadzić do utraty danych lub błędów w czasie działania (InvalidCastException).

    // Jawne rzutowanie z double na int
    double d = 123.45;
    int i = (int)d; // i będzie równe 123
    
    // Rzutowanie obiektu na konkretny typ
    object obj = "Hello";
    string s = (string)obj; // s będzie "Hello"
    
  2. Niejawne rzutowanie (Implicit conversion): Wykonywane automatycznie przez kompilator, gdy konwersja jest znana i bezpieczna, czyli bez utraty danych. Na przykład rzutowanie z int na double.

    // Niejawne rzutowanie z int na double
    int x = 10;
    double y = x; // y będzie 10.0
    
    // Niejawne rzutowanie klasy pochodnej na bazową
    class Base {}
    class Derived : Base {}
    
    Derived derivedObj = new Derived();
    Base baseObj = derivedObj; // Niejawne rzutowanie
    

Ponadto istnieją operatory as i is, które również odnoszą się do konwersji typów, ale z pewnymi cechami:

  • Operator as: Wykonuje rzutowanie typu, jeśli jest to możliwe, i zwraca null, jeśli nie powiodło się. Nie generuje wyjątku InvalidCastException. Używany tylko z typami referencyjnymi i Nullable.

    // Użycie operatora as
    object obj2 = "World";
    string s2 = obj2 as string; // s2 będzie "World"
    
    object obj3 = 123;
    string s3 = obj3 as string; // s3 będzie null
    
  • Operator is: Sprawdza, czy obiekt jest instancją określonego typu lub typu pochodnego. Zwraca true lub false. W najnowszych wersjach C# można go używać z pattern matching, aby jednocześnie sprawdzić i przekonwertować.

    // Użycie operatora is do sprawdzenia typu
    object obj4 = "Example";
    if (obj4 is string)
    {
        // Działania, jeśli obiekt jest stringiem
    }
    
    // Użycie is z pattern matching
    if (obj4 is string str)
    {
        // str jest dostępne tutaj jako string
    }