1. Giriş
Heç vaxt çalışmısan ki, qarpızı butulkaya soxasan? Bax, C# də hər dəfə bir tipdə olan dəyişəni başqa tipə verməyə çalışanda eyni problemlə qarşılaşır. Bəzən bu asandır (kiçik ədədi böyüyə çevirmək — elə bil alma çemodana qoyursan), bəzən isə ehtiyatlı olmaq lazımdır (qarpız butulkaya — burda problem olmadan keçmək olmur).
Tip çevrilməsi — bu, bir data tipində olan dəyəri başqa tipə çevirmək əməliyyatıdır. Bu, tez-tez lazım olur, məsələn, fərqli tiplərdə olan dəyərləri toplamaq, müqayisə etmək və ya yalnız müəyyən tip qəbul edən metodlara ötürmək istəyəndə.
Real həyatda proqramçılar bununla daim rastlaşır: ödəniş edirsən, endirim hesablayırsan, fiziki hesablama aparırsan və ya məsələn, istifadəçi tərəfindən klaviaturadan daxil edilən ədədləri parse edirsən (orada hər şey sətir kimi gəlir).
2. Qeyri-aydın tip çevrilməsi (Implicit Conversion)
Bu nədir?
Qeyri-aydın çevrilmə — bu o vaxtdır ki, C# özü sənin əvəzinə qərar verir ki, məlumatı bir tipdən digərinə problemsiz “köçürmək” olar. Hər şey avtomatik baş verir — sən heç nə yazmırsan, sadəcə dəyərlərdən istifadə edirsən.
- Kompilyator heç bir səhv vermir.
- Xüsusi komanda və ya cast lazım deyil.
- Məlumat itkisi olmur (demək olar ki, heç vaxt).
Qeyri-aydın çevrilməyə nümunə
int a = 42;
double b = a; // Qeyri-aydın çevrilmə int -> double
Console.WriteLine(b); // 42 (amma artıq bu 42.0-dır)
Burada a tipi int olan dəyişən avtomatik olaraq double olur və b dəyişəninə təyin olunur. Məlumat itkisi yoxdur, çünki bütün int dəyərləri asanlıqla double-a yerləşir.
Burada a tipi int olan dəyişən avtomatik olaraq double olur və b dəyişəninə təyin olunur. Məlumat itkisi yoxdur, çünki bütün int dəyərləri asanlıqla double-a yerləşir.
Bu nə vaxt işləyir?
- Alıcı tip geniş olanda — daha geniş data aralığını dəstəkləyir.
- Məlumat itkisi olmur.
- Nümunələr:
- int → long
- int → float / double
- float → double
- char → int
Başqa bir nümunə:
byte x = 100;
int y = x; // byte -> int (bütün byte dəyərləri int aralığına daxildir)
Ədədi tiplər üçün qeyri-aydın çevrilmə cədvəli
| From | To |
|---|---|
|
|
|
|
|
|
|
|
3. Aydın tip çevrilməsi (Explicit Conversion, Type Cast)
Magiyadan nə vaxt çatmır?
Bəzən kompilyator zəmanət verə bilmir ki, çevrilmə təhlükəsiz olacaq və səndən tələb edir ki, məsuliyyəti öz üzərinə götürəsən — yəni, açıq şəkildə bildirəsən ki, riskləri başa düşürsən.
- Mümkündür ki, məlumat itəcək.
- Dəyərin formatı dəyişə bilər.
- Bəzən çevrilmə ümumiyyətlə mümkün deyil — səhv alacaqsan.
Aydın çevrilmə necə yazılır?
Dairəvi mötərizə sintaksisi (cast) istifadə olunur:
double pi = 3.1415;
int wholePi = (int)pi; // Aydın çevrilmə double -> int
Console.WriteLine(wholePi); // 3 (ondalıq hissə atılır!)
Nə vaxt tətbiq olunur?
- Alıcı tip daha dar olanda — alıcıda dəyərlərin aralığı mənbədən dardır.
- Ondalıq hissə, məlumat itkisi, overflow ola bilər.
- Nümunələr:
- double → int
- long → int
- int → byte
- Demək olar ki, uyğun olmayan tiplər arasında istənilən keçidlər.
4. Nümunələrlə başa düşək
1) Məlumat itiririk? Gəlin yoxlayaq!
Qeyri-aydın çevrilmə — hər şey qaydasındadır!
int small = 25;
long big = small; // Qeyri-aydın çevrilmə (int -> long)
Console.WriteLine(big); // 25
Aydın çevrilmə — təhlükəli zona!
int big = 1000;
byte small = (byte)big; // Aydın çevrilmə (int -> byte)
Console.WriteLine(small); // 232 (!), çünki 1000 byte-a (0..255) yerləşmir
Burada nəticə — “sehrli” 232-dir, çünki 1000 % 256 == 232.
2) Ondalıq ədədlərlə (double, float)
double number = 9.99;
int approximate = (int)number; // ondalıq hissə sadəcə atılır
Console.WriteLine(approximate); // 9
3) Tam və ondalıq arasında çevrilmə (double ↔ int)
int apples = 5;
double exactApples = apples; // int -> double (qeyri-aydın)
Console.WriteLine(exactApples); // 5.0
double bananaWeight = 2.77;
int weightForReport = (int)bananaWeight; // double -> int (aydın)
Console.WriteLine(weightForReport); // 2
5. Sətirlərlə konvertasiya: Parse və Convert
Tip çevrilməsi ədədlərlə sətirlər arasında işləmir! Burada xüsusi metodlar lazımdır, məsələn:
string strNumber = "123";
int num = int.Parse(strNumber); // və ya Convert.ToInt32(strNumber);
Amma əksinə (int → string) avtomatik baş verir, sətirləri birləşdirəndə:
int number = 42;
string message = "Cavab: " + number; // Qeyri-aydın konvertasiya int → string
6. Tip çevrilməsində səhvlər
Tarix dərsi: bir dəfə kimsə tipi aydın çevirməyi unutdu və nəticədə ödəniş lazım olandan 250 dəfə az oldu... Tələbələr, diqqətli olun!
Tez-tez rast gəlinən səhv: məlumat itkisi ola biləcək yerdə qeyri-aydın çevrilmə etməyə cəhd.
int big = 500;
byte small = big; // Kompilyator: "Olmaz! Məlumat itkisi mümkündür!"
Burada aydın çevrilmə tələb olunur:
byte small = (byte)big; // Amma məlumat itirmək riskin var!
Başqa məşhur bug — ondalıq hissəni nəzərə almamaq:
double x = 2.9;
int y = (int)x; // y == 2, ondalıq hissə yox oldu
Düzgün yuvarlaqlaşdırmaq üçün Math.Round istifadə et:
int y = (int)Math.Round(x); // y == 3
7. Çevrilmə tələləri
- Məlumat itkisi. Mütləq yoxla ki, dəyər tipin icazə verilən aralığından çıxmır. Məsələn, int -2 147 483 648-dən 2 147 483 647-ə qədər saxlayır, byte isə yalnız 0–255.
- Yuvarlaqlaşdırma. Sadə çevrilmə ((int)x) sadəcə ondalıq hissəni atır. Düzgün yuvarlaqlaşdırmaq üçün Math.Round, Math.Floor, Math.Ceiling istifadə et.
- Ədədi literal-lar. Diqqət et, 3 / 2 1 verəcək (tam bölmə), 3.0 / 2 isə artıq 1.5 (double)!
- Qarışıq tipli əməliyyatlar. Əgər ifadədə, məsələn, int və double qarışırsa, nəticə double olacaq.
GO TO FULL VERSION