
ثابت ها انواعی از متغیرها هستند که مقدار آنها در طول برنامه تغییر نمی کند. ثابت ها حتما باید مقدار دهی اولیه شوند و اگر مقدار دهی آنها فراموش شود در برنامه خطا به وجود می آید. بعد از این که به ثابت ها مقدار اولیه اختصاص داده شد، هرگز در زمان اجرای برنامه نمیتوان آن را تغییر داد. برای تعریف ثابت ها باید از کلمه کلیدی const استفاده کرد. معمولا نام ثابت ها را طبق قرارداد با حروف بزرگ می نویسند تا تشخیص آنها در برنامه راحت باشد. نحوه تعریف ثابت در زیر آمده است:
const data_type identifier = initial_value;
مثال
class Program { public static void Main() { const int NUMBER = 1; NUMBER = 10; //ERROR, Cant modify a constant } }
در این مثال میبینید که مقدار دادن به یک ثابت، که قبلا مقدار دهی شده برنامه را با خطا مواجه می کند. نکته ی دیگری که نباید فراموش شود این است که، نباید مقدار ثابت را با مقدار دیگر متغیرهای تعریف شده در برنامه برابر قرار داد. به مثال زیر توجه کنید:
int someVariable; constint MY_CONST = someVariable
ممکن است این سؤال برایتان پیش آمده باشد که دلیل استفاده از ثابت ها چیست؟ اگر مطمئن هستید که مقادیری در برنامه وجود دارند که هرگز در طول برنامه تغییر نم یکنند، بهتر است که آنها را به صورت ثابت تعریف کنید. این کار هر چند کوچک، کیفیت برنامه شما را بالا می برد.
تبدیل ضمنی متغیرها یک نوع تبدیل است که به طور خودکار توسط کامپایلر انجام میشود. یک متغیر از یک نوع داده میتواند به طور ضمنی به یک نوع دیگر تبدیل شود به شرطی که مقدار آن از مقدار دادهای که می خواهد به آن تبدیل شود کمتر باشد. به عنوان مثال نوع دادهای byte میتواند مقادیر 0 تا 255 را در خود ذخیره کند و نوع دادهای int مقادیر 2147483648- تا 2147483647 را شامل میشود. پس میتوانید یک متغیر از نوع byte را به یک نوع int تبدیل کنید:
byte number1 = 5; int number2 = number1;
در مثال بالا مقدار number1 برابر 5 است در نتیجه متغیر number2 که یک متغیر از نوع صحیح است، میتواند مقدار number1 را در خود ذخیره کند. چون نوع int از نوع byte بزرگتر است، پس متغیر number1 که یک متغیر از نوع byte است میتواند به طور ضمنی به number2 که یک متغیر از نوع صحیح است تبدیل شود. اما عکس مثال بالا صادق نیست :
int number1 = 5; byte number2 = number1;
در این مورد ما با خطا مواجه میشویم. اگر چه مقدار 5 متغیر number1 در محدوده مقادیر byte یعنی اعداد بین 255-0 قرار دارد اما متغیر ی از نوع byte حافظه کمتری نسبت به متغیری از نوع int اشغال می کند. نوع byte شامل 8 بیت یا 8 رقم دودویی است، در حالی که نوع int شامل 32 بیت یا رقم دودویی است. یک عدد باینری عددی متشکل از اعداد 0 و 1 است. برای مثال عدد 5 در کامپیوتر به عدد باینری 101 ترجمه میشود. بنابراین وقتی ما عدد 5 را در یک متغیر از نوع بایت ذخیره میکنیم عددی به صورت زیر نمایش داده میشود:
00000101
و وقتی آن را در یک متغیر از نوع صحیح ذخیره میکنیم به صورت زیر نمایش داده میشود:
00000000000000000000000000000101
بنابراین قرار دادن یک مقدار int در یک متغیر byte درست مانند این است که ما سعی کنیم که یک توپ فوتبال را در یک سوراخ کوچک گلف جای دهیم. برای قرار دادن یک مقدار int در یک متغیر از نوع byte میتوان از تبدیل صریح استفاده کرد که در درس های آینده توضیح داده میشود. نکته دیگری که نباید فراموش شود این است که شما نمیتوانید اعداد با ممیز اعشار را به یک نوع int تبدیل کنید چون این کار باعث از بین رفتن بخش اعشاری این اعداد میشود.
double number1 = 5.25; int number2 = number1; //Error
میتوان یک نوع کاراکتر را به نوع ushort تبدیل کرد، چون هر دو دارای طیف مشابه ی از اعداد هستند. گرچه هر یک از آنها کاملا متفاوت توسط کامپایلر ترجمه میشوند. نوع char به عنوان یک کاراکتر و نوع ushort به عنوان یک عدد ترجمه میشود.
char charVar = 'c'; ushort shortVar = charVar; Console.WriteLine(charVar); Console.WriteLine(shortVar);
c
99
تبدیلاتی که کامپایلر به صورت ضمنی می تواند انجام دهد در جدول زیر آمده است:

نکته ای دیگر که معمولا ابهام بر انگیز است تعین نوع داده است. برای مثال ما چطور بدانیم که مثل عدد 7 از نوع long ،uint ،int یا ulong است؟ برای این کار باید کاراکترهایی را به انتهای اعداد اضافه کنیم.
uint number1 = 7U; long number2 = 7L; ulong number3 = 7UL;
در حالت پیشفرض و بدون قرار دادن کاراکتر در انتهای عدد، کامپایلر عدد را از نوع صحیح (int) در نظر می گیرد و در حالت پیشفرض کامپایلر اعداد دسیمال (decimal) را اعداد double در نظر می گیرد. شما میتوانید برای نشان دادن اعداد اعشاری float از کاراکتر F و برای نشان دادن اعداد دسیمال از کاراکتر M استفاده کنید.
double number1 = 1.23; float number2 = 1.23F; decimal number3 = 1.23M;
تبدیل صریح نوعی تبدیل است که برنامه را مجبور می کند که یک نوع داده را به نوعی دیگر تبدیل کند، اگر این نوع تبدیل از طریق تبدیل ضمنی انجام نشود. در هنگام استفاده از این تبدیل باید دقت کرد. چون در این نوع تبدیل ممکن است مقادیر اصلح یا حذف شوند. ما میتوانیم این عملیات را با استفاده از Cast انجام دهیم. Cast فقط نام دیگر تبدیل صریح است و دستور آن به صورت زیر است:
datatypeA variableA = value; datatypeB variableB = (datatypeB)variableA;
همانطور که از قبل مشاهده کردید نوع int را نتوانستیم به نوع byte تبدیل کنیم، اما اکنون با استفاده از عمل Cast این تبدیل انجام خواهد شد:
int number1 = 5; byte number2 = (byte)number1;
حال اگر برنامه را اجرا کنید با خطا مواجه نخواهید شد. همانطور که پیشتر اشاره شد ممکن است در هنگام تبدیلت مقادیر اصلی تغییر کنند. برای مثال وقتی که یک عدد با ممیز اعشار مثل از نوع double را به یک نوع int تبدیل میکنیم مقدار اعداد بعد از ممیز از بین می روند:
double number1 = 5.25; int number2 = (int)number1; Console.WriteLine(number2);
5
خروجی کد بالا عدد 5 است چون نوع دادهای int نمیتواند مقدار اعشار بگیرد. حالت دیگر را تصور کنید. اگر شما بخواهید یک متغیر را که دارای مقداری بیشتر از محدوده متغییر مقصد هست تبدیل کنید چه اتفاقی می افتد؟ مانند تبدیل زیر که می خواهیم متغیر number1 را که دارای مقدار 300 است را به نوع Byte که محدود اعداد بین 255-0 را پوشش میدهد، تبدیل کنیم.
int number1 = 300; byte number2 = (byte)number1; Console.WriteLine("Value of number2 is {0}.", number2);
Value of number2 is .44
خروجی کد بالا عدد 44 است. Byte فقط میتواند شامل اعداد 0 تا 255 باشد و نمیتواند مقدار 300 را در خود ذخیره کند. حال می خواهیم ببینیم که چرا به جای عدد 300، عدد 44 را در خروجی نمایش داده میشود. این کار به تعداد بیت ها بستگی دارد. یک byte دارای 8 بیت است درحالی که int دارای 32 بیت است. حال اگر به مقدار باینری 2 عدد توجه کنید متوجه می شوید که چرا خروجی عدد 44 است.
300 = 00000000000000000000000100101100 255 = 11111111 44 = 00101100
خروجی بالا نشان میدهد که بیشترین مقدار byte که عدد 255 است، میتواند فقط شامل 8 بیت باشد (11111111) بنابراین فقط 8 بیت اول مقدار int به متغیر byte انتقال مییابد که شامل (00110100) یا عدد 44 در مبنای 10 است. قرار ندادن یک مقدار مناسب در داخل یک متغیر باعث ایجاد یک سرریز (overflow) میشود. یک مورد آن سرریز ریاضی نام دارد که در مثال زیر مشاهده میکنید:
byte sum = (byte)(150 + 150);
گرچه در این تبدیل ما دادههایی را از دست می دهیم، اما کامپایلر کد ما را قبول می کند. برای اینکه برنامه هنگام وقوع سرریز پیغام خطا بدهد میتوان از کلمه کلیدی checked استفاده کرد.
int number1 = 300; byte number2 = checked((byte)number1); Console.WriteLine("Value of number2 is {0}.", number2);
Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow ...
برنامه پیغام System.OverflowException که به زبان ساده نشان دهند وقوع خطاست. در نتیجه شما میتوانید از اجرای برنامه جلوگیری کنید.
.NET Framework دارای یک کلاس استاتیک است، که میتوان از آن برای تبدیل مقادیر از نوعی به نوع دیگر استفاده کرد. این کلاس به نوبه خود دارای متدهایی برای تبدیل انواع داده به یکدیگر میباشد. در جدول زیر متدها ذکر شده اند:

در برنامه زیر یک نمونه از تبدیل متغیرها با استفاده از کلاس Convert و متدهای آن نمایش داده شده است:
double x = 9.99; int convertedValue = Convert.ToInt32(x); Console.WriteLine("Original value is: " + x); Console.WriteLine("Converted value is: " + convertedValue);
Original value is: 9.99 Converted
value is: 10
مقدار val هر نوع دادهای میتواند باشد، اما باید مطمئن شد که به نوع دادهای مورد نظر تبدیل شود.