Czym jest konwersja typów?
W programowaniu konwersja typów to proces przekształcania jednej wartości z jednego typu danych w inny. Na przykład, możemy chcieć zamienić liczbę całkowitą (int
) na liczbę zmiennoprzecinkową (double
), lub tekst (string
) na liczbę (int
). Czasami musimy to robić, aby móc wykonać pewne operacje na danych, które są w różnych formatach.
Rodzaje konwersji typów danych
W C# istnieją dwa główne rodzaje konwersji typów:
Konwersja niejawna (implicit)
Konwersja niejawna to taka, która odbywa się automatycznie, bez potrzeby wskazywania, że chcemy zmienić typ. Może mieć miejsce tylko wtedy, gdy nie występuje ryzyko utraty danych, czyli gdy konwertujemy mniejszy typ na większy.
Przykład:
int liczbaCalkowita = 10;
double liczbaZmiennoprzecinkowa = liczbaCalkowita; // Konwersja niejawna
W tym przypadku int
(liczba całkowita) jest automatycznie konwertowane na double
(liczba zmiennoprzecinkowa), ponieważ double
może bezpiecznie przechowywać wartość typu int
.
Konwersja jawna (explicit)
Konwersja jawna to taka, którą musimy przeprowadzić ręcznie. Ma ona miejsce wtedy, gdy istnieje ryzyko utraty danych, np. konwersja liczby zmiennoprzecinkowej (double
) na liczbę całkowitą (int
), gdzie część ułamkowa jest tracona.
Przykład:
double liczbaZmiennoprzecinkowa = 12.9;
int liczbaCalkowita = (int)liczbaZmiennoprzecinkowa; // Konwersja jawna
Console.WriteLine(liczbaCalkowita); // Wypisze: 12
W tym przypadku liczba zmiennoprzecinkowa 12.9 jest konwertowana na liczbę całkowitą, ale część ułamkowa (0.9) zostaje odrzucona.
Konwersja między typami prostymi w C#
Konwersja liczbowych typów prostych
W C# można konwertować między różnymi typami liczbowymi, takimi jak int
, double
, float
, decimal
, long
i innymi. Niektóre konwersje są niejawne, ale inne wymagają jawnej konwersji.
Konwersja niejawna (większy typ może pomieścić mniejszy typ):
int liczbaCalkowita = 100;
double liczbaZmiennoprzecinkowa = liczbaCalkowita; // Nie trzeba rzutowania
Console.WriteLine(liczbaZmiennoprzecinkowa); // Wypisze: 100.0
Konwersja jawna (mniejszy typ nie może automatycznie pomieścić większego typu):
double liczbaZmiennoprzecinkowa = 9.78;
int liczbaCalkowita = (int)liczbaZmiennoprzecinkowa; // Rzutowanie jest wymagane
Console.WriteLine(liczbaCalkowita); // Wypisze: 9 (traci część ułamkową)
Konwersja między typami zmiennoprzecinkowymi
Możemy również konwertować pomiędzy typami zmiennoprzecinkowymi, np. między float
, double
i decimal
.
Przykład konwersji float
na double
:
float liczbaFloat = 9.87f;
double liczbaDouble = liczbaFloat; // Nie trzeba rzutowania, ponieważ double jest większy niż float
Console.WriteLine(liczbaDouble); // Wypisze: 9.87
Przykład konwersji double
na float
:
double liczbaDouble = 12345.6789;
float liczbaFloat = (float)liczbaDouble; // Rzutowanie jest wymagane
Console.WriteLine(liczbaFloat); // Wypisze: 12345.68 (zaokrąglenie)
Konwersja między int
a string
Czasami musimy zamienić liczbę na tekst lub odwrotnie.
Konwersja int
na string
:
int liczba = 123;
string tekst = liczba.ToString(); // Zamiana liczby na tekst
Console.WriteLine(tekst); // Wypisze: "123"
Konwersja string
na int
:
Jeśli mamy tekst, który reprezentuje liczbę, możemy go zamienić z powrotem na liczbę. Możemy to zrobić za pomocą metody int.Parse()
lub int.TryParse()
.
string tekst = "456";
int liczba = int.Parse(tekst); // Zamiana tekstu na liczbę
Console.WriteLine(liczba); // Wypisze: 456
Uwaga: int.Parse()
zadziała tylko, jeśli tekst faktycznie jest liczbą. W przeciwnym razie program zgłosi błąd. Bezpieczniejszą opcją jest użycie int.TryParse()
, która zwraca wartość logiczną (true
lub false
), informując, czy konwersja się powiodła.
string tekst = "123abc";
int liczba;
bool czyUdanaKonwersja = int.TryParse(tekst, out liczba);
if (czyUdanaKonwersja)
{
Console.WriteLine("Konwersja udana: " + liczba);
}
else
{
Console.WriteLine("Konwersja nieudana.");
}
Używanie klasy Convert
W C# mamy także klasę Convert
, która pozwala na łatwą konwersję między różnymi typami danych. Jest ona szczególnie przydatna, gdy nie wiemy dokładnie, jaki typ danych będzie konwertowany.
Przykład konwersji int
na double
za pomocą klasy Convert
:
int liczbaCalkowita = 10;
double liczbaZmiennoprzecinkowa = Convert.ToDouble(liczbaCalkowita);
Console.WriteLine(liczbaZmiennoprzecinkowa); // Wypisze: 10.0
Przykład konwersji string
na int
za pomocą klasy Convert
:
string tekst = "123";
int liczba = Convert.ToInt32(tekst);
Console.WriteLine(liczba); // Wypisze: 123
Uwaga: Klasa Convert
działa podobnie do Parse
, ale jest bardziej elastyczna i umożliwia konwersję między wieloma typami danych.
Obsługa błędów przy konwersji
Konwersja typów może prowadzić do błędów, jeśli próbujemy przekonwertować dane, które nie są zgodne z docelowym typem. Na przykład, próba zamiany tekstu „abc” na liczbę spowoduje błąd.
Dlatego warto stosować metody, które obsługują błędy, takie jak TryParse
. Dzięki temu możemy sprawdzić, czy konwersja się udała, zanim spróbujemy pracować na przekonwertowanej wartości.
Przykład:
string tekst = "abc";
int liczba;
if (int.TryParse(tekst, out liczba))
{
Console.WriteLine("Konwersja udana: " + liczba);
}
else
{
Console.WriteLine("Konwersja nieudana. Tekst nie jest liczbą.");
}
Konwersja typów z bool
Konwersja wartości logicznych (bool
) na inne typy danych jest również możliwa.
Przykład konwersji bool
na string
:
bool czyZalogowany = true;
string tekst = czyZalogowany.ToString();
Console.WriteLine(tekst); // Wypisze: "True"
Przykład konwersji string
na bool
:
string tekst = "true";
bool wartoscLogiczna = bool.Parse(tekst);
Console.WriteLine(wartoscLogiczna); // Wypisze: True
Podsumowanie Konwersji Typów w C#
Rodzaj Konwersji | Opis | Przykład |
---|---|---|
Niejawna | Odbywa się automatycznie, gdy nie ma ryzyka utraty danych. | int → double |
Jawna | Wymaga rzutowania, ponieważ istnieje ryzyko utraty danych. | double → int |
Konwersja Tekstowa | Używana do zamiany liczb na teksty i odwrotnie. | int.Parse("123") → 123 |
Klasa Convert | Elastyczna klasa do konwersji między różnymi typami danych. | Convert.ToInt32("123") → 123 |
TryParse | Bezpieczna metoda konwersji, która zwraca wartość logiczną, informującą o powodzeniu konwersji. | int.TryParse("abc", out wynik) → false |