Konwersje typów, jawne i niejawne

ASP NET MVC i C#
typy jawne niejawne casting rzutowanie

Konwersje typów (type casting) to akcje, które są podejmowane relatywnie często. Ważne jest zrozumienie podstawowych zasad by uniknąć prostych błędów.

 

Konwersje ze względu na przechowywane dane:

  • poszerzające: zmieniany jest podstawowy typ na typ, który pozwala przechować więcej informacji na przykład int na double
  • przybliżające: zmieniany jest podstawowy typ na typ, który pozwala przechować mniej informacji np.: double na int.

 

Dużo ciekawszy jest podział konwersji ze względu na sposób dokonania:

  • jawne (explicit)
    • wymagają zastosowania operatora rzutowania
    • opcje:
      • konwersja prosta
        • na przykład:
          i = (int)liczba;
        • może zwrócić InvalidCastException w przypadku niepowodzenia
        • operator “is” pozwala sprawdzić czy rzutowanie się powiedzie
          • na przykład:
            if ( fiat is Car)
            {
                Fiat fiat = (Car) fiat;
            }
      • za pomocą operatora konwersji “as”
        • na przykład:
          i = liczba as SomeClass
        • nie zwróci InvalidCastException w przypadku niepowodzenia
        • sprawdza najpierw, czy operacja rzutowania może się wykonać
        • jeśli operacja może zostać wykonana następuje rzutowanie, w przeciwnym wypadku operator zwróci referencję bądź wartość null
        • w związku z tym, że może zostać zwrócony null, to konwersja taka może tylko być dokonana na typ referencyjny
        • wyjątkiem jest typ wartościowy nullable (np. “int?”)
      • zdefiniowana w kodzie przez przeciążenie operatora
        • musi być publiczna i statyczna
        • na przykład:
          struct SomeClass
          {
              private int value;
          
          
              public static implicit operator int(SomeClass z) 
              {
                  return z.value;
              }
          }
          SomeClass getSth = SomeClass(13);
  • niejawne (implicit)
    • nie wymagają używania operatora rzutowania
    • opcje:
      • konwersja prosta
        • na przykład konwersja  mniejszego na większy typ danych lub klasy pochodnej na bazową:
          int wartosc1 = double wartosc2
      • zdefiniowana w kodzie przez przeciążenie operatora
        • musi być publiczna i statyczna
        • na przykład:
          struct SomeClass
          {
              private int value;
              public static explicit operator int SomeClass z) 
              {
                  return z.value; 
              }
          }
          SomeClass getSth = SomeClass(13);
          int sth =(int)getSth;
  • za pomocą zdefiniowanych metod pomocy dostępnych w bibliotekach
    • na przykład
      int sthInt = 13; 
      string sth = sthInt.ToString();
  • za pomocą parsowania “Parse”
    • na przykład:
      int sthInt = Int32.Parse("-105");
    • tylko do parsowania stringów
    • zwróci FormatException lub OverflowException w przypadku niepowodzenia
  • za pomocą próby parsowania “TryParse”
    • wymaga zdefiniowania zmiennej przed próbą parsowania
    • tylko do parsowania stringów
    • zmienna zostanie przypisana dzięki parametrowi wyjściowemu (out)
      • na przykład:
        int value;
        if(!int.TryParse("1", out value)){
    • zwraca 0 w przypadku niepowodzenia
  • za pomocą Convert
    • na przykład:
      Convert.ToInt32(string s);
    • można konwertować z każdej klasy implementującej interfejs IConvertible
    • zwraca FormatException w przypadku niepowodzenia

Źródła: Źródła własne

Tomasz Osiński Tomasz Osiński
Konwersje typów, jawne i niejawne
2017-11-02 18:46:52
Komentarze
Aby dodac komentarz musisz być zalogowany

Zobacz podobne artykuły

Nazywam się Tomasz Osiński. Jestem programistą web developerem od 2008 roku. Obecnie pracuję w Banku Millennium jak .NET web developer, poza tym rozwijam startupy, blogguję. Pokazuję, że za pomocą ASP.NET, HTML, CSS i JS można budować wydajne aplikacje i strony internetowe. Ukazuję potrzeby wdrażania nowoczesnego podejścia do zarządzania w IT (Lean, Kanban, SCRUM, Agile)

Blog, który czytasz tworzę w w/w technologiach i udostępniam na GitHubie