CodeGym /Kurslar /C# SELF /Aydın və qeyri-aydın tip çevrilməsi

Aydın və qeyri-aydın tip çevrilməsi

C# SELF
Səviyyə, Dərs
Mövcuddur

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
byte
short, ushort, int, uint, long, ulong, float, double, decimal
int
long, float, double, decimal
float
double
char
ushort, int, uint, long, ulong, float, double, decimal

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

Qeyd::

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.
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Ondalıklı ədədi tam ədədə yuvarlaqlaşdırmaq
Ondalıklı ədədi tam ədədə yuvarlaqlaşdırmaq
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Məlumat itkisi ilə ədədin çevrilməsi
Məlumat itkisi ilə ədədin çevrilməsi
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Həqiqi ədədlər
Dəqiqlik problemləri və xüsusi dəyərlər
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION