همه چیز درباره تبدیلهای عددی (Casting)
تا حالا فکر کردید وقتی یه int رو توی یه long میریزید، یا یه double رو به زور تو یه int جا میدید، پشت صحنه چه اتفاقی میفته؟
این تبدیلها (Conversions) قوانین خودشون رو دارن و ندونستن این قوانین، میتونه به از دست رفتن داده و باگهای وحشتناک ختم بشه. بزن بریم این قوانین رو یک بار برای همیشه یاد بگیریم.
✅ نوع اول: تبدیلهای امن و ضمنی (Implicit)
این تبدیلها مثل ریختن آب از یه لیوان کوچیک تو یه سطل بزرگه؛ کاملاً امن، بدون دردسر و بدون از دست رفتن حتی یک قطره آب!
وقتی نوع داده مقصد، گنجایش تمام مقادیر ممکن در نوع داده مبدأ رو داشته باشه، #C خودش هوشمندانه و به صورت خودکار این تبدیل رو انجام میده.
int myInt = 12345;
// int (32-bit) به راحتی در long (64-bit) جا میشه
long myLong = myInt;
// int (عدد صحیح) به راحتی به double (عدد اعشاری) تبدیل میشه
double myDouble = myInt;
float myFloat = 123.45F;
// float (32-bit) به راحتی در double (64-bit) جا میشه
double anotherDouble = myFloat;
⚠️ نوع دوم: تبدیلهای خطرناک و صریح (Explicit Casting)حالا برعکسش رو تصور کنید: میخواید آب یه سطل بزرگ رو تو یه لیوان کوچیک جا بدید. احتمال اینکه آب سرریز بشه و بخشی ازش از دست بره، خیلی زیاده!
اینجا دیگه سیشارپ به شما اجازه نمیده این کار رو خودکار انجام بدید. شما باید با مسئولیت خودتون و با استفاده از Casting (قرار دادن نوع مقصد داخل پرانتز)، به کامپایلر بگید: "میدونم دارم چیکار میکنم و ریسکش رو میپذیرم!"
long bigNum = 3_000_000_000L;
double myDouble = 12345.6789;
// برای جا دادن long در int، باید کست کنیم
// اگه عدد بزرگ باشه، داده از دست میره!
int myInt = (int)bigNum;
// برای جا دادن double در int، باید کست کنیم
int anotherInt = (int)myDouble; // مقدارش میشه 12345
💣 دو تله مرگبار در تبدیلهای صریح
وقتی کست میکنید، حواستون به این دوتا تله باشه:
بریده شدن اعشار (Truncation):
وقتی یه عدد اعشاری (double یا float) رو به یه عدد صحیح (int) کست میکنید، بخش اعشاری عدد گرد نمیشه، بلکه وحشیانه بریده و حذف میشه!
double price = 99.99;
int priceAsInt = (int)price; // مقدارش میشه 99، نه 100!
از دست رفتن دقت (Precision Loss):
گاهی اوقات، حتی در تبدیلهای امن (مثل int به float)، ممکنه دقت رو از دست بدید. float میتونه اعداد خیلی بزرگتری رو نشون بده، ولی دقتش در جزئیات کمتر از int هست.
int bigInt = 100_000_001;
// اینجا مقدار حفظ میشه، ولی دقت از بین میره
float myFloat = bigInt;
// وقتی برمیگردونیم، میبینیم که عدد تغییر کرده!
int convertedInt = (int)myFloat; // مقدارش میشه 100_000_000
🔖 هشتگها :
#CSharp
#CodingTips
#Casting