وقتی قدم در دنیای برنامهنویسی با زبان شیرین سیشارپ میگذارید، یکی از اولین و بنیادیترین مفاهیمی که مثل آچار فرانسه به کارتان میآید، «انواع داده» یا همان Data Types است. اما انواع داده در C# چیست و چرا اینقدر در مرکز توجه قرار دارند؟ به زبان ساده، انواع داده به کامپیوتر میفهمانند که هر متغیر چه جور اطلاعاتی را میتواند در خود جای دهد. این اطلاعات میتوانند اعداد صحیح (مثل تعداد محصولات در انبار)، اعداد اعشاری (مانند قیمت یک کالا با تخفیف)، یک حرف تنها (مثلاً گرید دانشجو)، یا مقادیر منطقی درست/غلط (مانند وضعیت موجود بودن کالا) باشند.
استفاده هوشمندانه و صحیح از انواع داده، فقط یک قانون خشک برنامهنویسی نیست؛ بلکه مزایای کلیدی برای شما به ارمغان میآورد:
- بهینهسازی مصرف حافظه: هر نوع داده، فضای مشخصی از حافظه را اشغال میکند. انتخاب نوع داده متناسب با نیاز، از هدر رفتن بیدلیل منابع ارزشمند حافظه جلوگیری میکند.
- افزایش چشمگیر عملکرد برنامه: پردازش دادهها زمانی که نوع آنها دقیقاً مشخص است، برای کامپیوتر بسیار سریعتر و کارآمدتر خواهد بود.
- خوانایی و نگهداری آسانتر کد: وقتی نوع هر متغیر به وضوح تعریف شده باشد، فهم منطق برنامه، هم برای خودتان در آینده و هم برای سایر اعضای تیم، به مراتب سادهتر میشود.
در این مقاله چه چیزهایی یاد میگیریم؟ (فهرست مطالب)
در این راهنمای کامل، قدم به قدم با تمام جنبههای انواع داده در سی شارپ آشنا خواهید شد:
- انواع دادهها در C# دقیقاً چه هستند؟
- چگونه یک متغیر با نوع داده مشخص در C# تعریف کنیم؟ (سینتکس)
- مثالهای کاربردی و ملموس از انواع دادهها
- دستهبندی کلی انواع دادهها در C# (مقداری، مرجعی، اشارهگر)
- جادوی تبدیل انواع دادهها به یکدیگر
- بهترین شیوهها و اصول طلایی در استفاده از انواع دادهها
- اشتباهات رایج برنامهنویسان و نحوه اجتناب از آنها
- پاسخ به پرسشهای متداول شما
انواع دادهها در C# چیست؟ یک نگاه عمیقتر!
در زبان برنامهنویسی C#، هر متغیری که تعریف میکنید، باید پیش از استفاده، نوع داده آن به طور واضح مشخص شود. نمیتوانید متغیری داشته باشید که هویتش نامعلوم باشد! C# یک زبان برنامهنویسی strongly-typed (یا به فارسی، دارای نوعدهی قوی) است. این اصطلاح به چه معناست؟ یعنی اگر شما متغیری را مثلاً از نوع «عدد صحیح» تعریف کردید، دیگر نمیتوانید مستقیماً در آن «متن» ذخیره کنید (مگر اینکه فرآیند تبدیل نوع را طی کنید). هر متغیر تنها و تنها دادههایی از جنس و نوع خودش را میپذیرد. این سختگیری اولیه، شاید در ابتدا کمی دستوپاگیر به نظر برسد، اما در درازمدت، به شدت به کاهش خطاها و افزایش پایداری برنامههای شما کمک میکند.
چگونه یک متغیر در C# تعریف کنیم؟ (سینتکس و مثال)
سینتکس تعریف متغیر در C#
قالب کلی برای تعریف یک متغیر در زبان سیشارپ به شکل زیر است:
<DATA TYPE> <VARIABLE NAME> = <VALUE>;
همچنین میتوانید ابتدا متغیر را تعریف کرده و سپس در جایی دیگر از کد به آن مقدار اختصاص دهید:
<DATA TYPE> <VARIABLE NAME>;
// ... سایر کدها ...
<VARIABLE NAME> = <VALUE>;
مثالهای کاربردی از تعریف متغیر
بیایید با چند مثال ساده، این موضوع را شفافتر کنیم:
string userName = "علی رضایی"; // یک متغیر از نوع رشته (string) برای ذخیره نام کاربر
int userAge = 30; // یک متغیر از نوع عدد صحیح (int) برای ذخیره سن
double productPrice = 12500.75; // یک متغیر از نوع عدد اعشاری (double) برای ذخیره قیمت محصول
bool isActiveUser = true; // یک متغیر از نوع بولی (bool) برای وضعیت فعال بودن کاربر
مثال عملی: انواع داده در یک برنامه واقعی سی شارپ
برای درک بهتر، بیایید ببینیم چگونه انواع دادههای مختلف در یک برنامه ساده و کاربردی مورد استفاده قرار میگیرند:
using System;
class StudentInfoProgram
{
static void Main()
{
// تعریف متغیرها با انواع داده متناسب
string studentName = "سارا احمدی"; // نام دانشجو (نوع رشته - string)
int studentAge = 22; // سن دانشجو (نوع عدد صحیح - int)
double averageMark = 18.75; // معدل نمرات (نوع عدد اعشاری - double)
char finalGrade = 'A'; // گرید نهایی (نوع کاراکتر - char)
bool isEnrolledFullTime = true; // وضعیت ثبتنام تمام وقت (نوع بولی - bool)
// نمایش اطلاعات دانشجو در خروجی
Console.WriteLine("نام دانشجو: " + studentName);
Console.WriteLine("سن: " + studentAge + " سال");
Console.WriteLine("معدل: " + averageMark);
Console.WriteLine("گرید نهایی: " + finalGrade);
Console.WriteLine("ثبتنام تمام وقت: " + isEnrolledFullTime);
}
}
خروجی برنامه فوق به این صورت خواهد بود:
نام دانشجو: سارا احمدی
سن: 22 سال
معدل: 18.75
گرید نهایی: A
ثبتنام تمام وقت: True
دستهبندی اصلی انواع دادهها در C#
در زبان سیشارپ، انواع دادهها را میتوان به سه دسته اصلی و مهم تقسیمبندی کرد:
- انواع مقداری (Value Types)
- انواع مرجعی (Reference Types)
- انواع اشارهگر (Pointer Types) (کاربرد خاص و کمتر رایج)
حالا به تفصیل هر یک را بررسی میکنیم:
1. انواع مقداری (Value Types) در سی شارپ
این دسته از انواع داده، خودِ مقدار داده را به طور مستقیم در حافظه (در بخشی به نام Stack) ذخیره میکنند. تصور کنید یک جعبه دارید که خودِ شیء ارزشمند مستقیماً داخل آن قرار گرفته است. هنگامی که یک متغیر از نوع مقداری را به متغیر دیگری نسبت میدهید، یک کپی کامل از آن مقدار ایجاد و در متغیر جدید ذخیره میشود. تغییر در یکی، روی دیگری تأثیری ندارد.
مهمترین و پرکاربردترین انواع مقداری عبارتند از:
- اعداد صحیح (Integral types): برای ذخیرهسازی اعداد کامل و بدون بخش اعشاری.
- byte: اعداد مثبت کوچک (0 تا 255).
- sbyte: اعداد صحیح علامتدار کوچک (128- تا 127).
- short: اعداد صحیح با دامنه متوسط.
- ushort: اعداد صحیح مثبت با دامنه متوسط.
- int: رایجترین و پیشفرضترین نوع برای اعداد صحیح.
- uint: اعداد صحیح مثبت بزرگ.
- long: اعداد صحیح بسیار بزرگ.
- ulong: اعداد صحیح مثبت بسیار بسیار بزرگ.
- اعداد اعشاری (Floating-point types): برای ذخیره اعدادی که دارای ممیز و بخش اعشاری هستند.
- float: دقت کمتر، حجم کمتر در حافظه.
- double: دقت بیشتر، حجم بیشتر در حافظه (پیشفرض برای اعداد اعشاری).
- decimal: دقت فوقالعاده بالا، ایدهآل برای محاسبات مالی و پولی که حتی کوچکترین خطای گردکردن نیز غیرقابل قبول است.
- کاراکتر (char): برای ذخیره تنها یک حرف، یک عدد یا یک نماد (مثلاً ‘B’، ‘5’، ‘؟’).
- بولی (bool): تنها دو مقدار ممکن را میپذیرد: true (درست) یا false (غلط).
- enum (Enumerations): برای تعریف مجموعهای از ثابتهای نامگذاری شده و مرتبط (مانند روزهای هفته، ماههای سال).
- struct (Structures): برای ایجاد انواع داده سفارشی و سبکوزن که رفتار مقداری دارند.
جدول خلاصه و کاربردی انواع داده عددی صحیح در C#
نوع داده | اندازه در حافظه (بایت) | محدوده تقریبی مقادیر قابل ذخیره |
byte | 1 | 0 تا 255 |
sbyte | 1 | 128- تا 127 |
short | 2 | 32,768- تا 32,767 |
ushort | 2 | 0 تا 65,535 |
int | 4 | حدود 2.1- میلیارد تا 2.1 میلیارد |
uint | 4 | 0 تا حدود 4.2 میلیارد |
long | 8 | بسیار بزرگ (حدود 9.2e+18- تا 9.2e+18) |
ulong | 8 | 0 تا بسیار بسیار بزرگ (حدود 1.8e+19) |
جدول خلاصه و کاربردی انواع داده عددی اعشاری در C#
نوع داده | اندازه در حافظه (بایت) | دقت تقریبی (تعداد ارقام معنیدار اعشار) |
float | 4 | 6 تا 7 رقم |
double | 8 | 15 تا 16 رقم |
decimal | 16 | 28 تا 29 رقم |
✅ نکته طلایی و بسیار مهم: برای هرگونه محاسبات مالی، حسابداری، یا مواردی که دقت اعشار حیاتی است (مانند مبالغ پولی)، بدون هیچ تردیدی از نوع داده decimal استفاده کنید. این کار شما را از خطاهای گردکردن ناخواسته که با float و double ممکن است رخ دهد، مصون میدارد.
2. انواع مرجعی (Reference Types) در سی شارپ
برخلاف انواع مقداری، این دسته از انواع داده، خودِ داده را مستقیماً در خود نگه نمیدارند. به جای آن، یک آدرس (یا مرجع) به مکانی در حافظه (در بخشی به نام Heap) را ذخیره میکنند که داده واقعی در آنجا قرار گرفته است. مانند یک کارت ویزیت که آدرس دفتر کار روی آن نوشته شده، نه خودِ دفتر کار.
نکته کلیدی اینجاست: وقتی یک متغیر از نوع مرجعی را به متغیر دیگری نسبت میدهید، تنها آن آدرس کپی میشود. در نتیجه، هر دو متغیر به یک مکان واحد در حافظه اشاره خواهند کرد. این یعنی اگر محتوای آن مکان را از طریق یکی از متغیرها تغییر دهید، متغیر دیگر نیز آن تغییر را مشاهده خواهد کرد!
مهمترین و پرکاربردترین انواع مرجعی عبارتند از:
- object: نوع پدر و پایه تمامی انواع دیگر در سیشارپ! هر نوع دادهای در C#، چه مقداری و چه مرجعی، به طور مستقیم یا غیرمستقیم از object ارثبری میکند.
- dynamic: یک نوع داده خاص که بررسی نوع آن به جای زمان کامپایل، در زمان اجرای برنامه انجام میشود. این نوع انعطافپذیری زیادی میدهد اما باید با آگاهی و احتیاط کامل استفاده شود، زیرا میتواند منجر به خطاهای زمان اجرا شود.
- string: برای ذخیرهسازی رشتههای متنی (مثلاً “سلام، به وبسایت ما خوش آمدید!”). جالب است بدانید که اگرچه string یک نوع مرجعی است، اما رفتار آن در بسیاری از موارد (به دلیل immutable بودن یا تغییرناپذیری) شبیه به انواع مقداری است.
- array (آرایهها): برای نگهداری مجموعهای از مقادیر همنوع، مانند لیستی از نمرات دانشجویان یا نام محصولات.
- کلاسها (Classes)، اینترفیسها (Interfaces) و دلیگیتها (Delegates): اینها مفاهیم بنیادی و پیشرفتهتری در برنامهنویسی شیءگرا با سیشارپ هستند که در مقالات تخصصی بعدی به طور مفصل به آنها خواهیم پرداخت.
3. انواع اشارهگر (Pointer Types) در سی شارپ – برای کاربران حرفهای!
این نوع دادهها نیز، همانند انواع مرجعی، آدرس حافظه یک متغیر دیگر را در خود نگه میدارند. اما تفاوت اصلی در نحوه کار با آنها و سطح دسترسی است. استفاده از اشارهگرها معمولاً در کدهایی که در محیط unsafe (ناامن) نوشته میشوند، صورت میگیرد.
در برنامهنویسی متداول و روزمره با سیشارپ، مگر در موارد بسیار خاص (مانند نیاز به کار مستقیم با حافظه برای بهینهسازیهای سطح پایین، یا ارتباط با کتابخانههای نوشته شده به زبانهایی مثل C یا C++)، به ندرت با انواع اشارهگر سروکار خواهید داشت.
مثال (صرفاً برای آشنایی اولیه):
unsafe class PointerExample
{
static void Main()
{
int number = 100;
// ptr حاوی آدرس حافظهای است که متغیر number در آن قرار دارد
int* ptr = &number;
Console.WriteLine("مقدار اولیه متغیر number: " + number);
Console.WriteLine("آدرس حافظه ذخیره شده در ptr: " + (ulong)ptr);
// تغییر مقدار متغیر number از طریق اشارهگر
*ptr = 150;
Console.WriteLine("مقدار جدید متغیر number پس از تغییر با اشارهگر: " + number); // خروجی: 150
}
}
⚠️ هشدار مهم: برای اینکه کد حاوی بلوک unsafe و اشارهگرها کامپایل و اجرا شود، باید در تنظیمات پروژه خود (معمولاً در بخش Build یا Compile)، گزینه “Allow unsafe code” را فعال نمایید. استفاده نادرست از اشارهگرها میتواند منجر به خطاهای جدی و ناپایداری برنامه شود.
جادوگری با دادهها: تبدیل انواع داده به یکدیگر (Type Conversion) در C#
در مسیر کدنویسی، بارها و بارها پیش میآید که نیاز پیدا میکنید دادهای از یک نوع خاص را به نوع دیگری تبدیل کنید. سیشارپ دو روش اصلی و مکانیزم هوشمند برای این منظور در اختیار شما قرار میدهد:
1. تبدیل ضمنی (Implicit Conversion): وقتی C# کار را برایتان راحت میکند!
در برخی شرایط، سیشارپ به قدری هوشمند است که میتواند انواع داده را به طور خودکار و بدون نیاز به دخالت مستقیم شما به یکدیگر تبدیل کند. این اتفاق زمانی رخ میدهد که تبدیل از یک نوع به نوع دیگر کاملاً امن باشد و هیچگونه از دست رفتن اطلاعاتی (Data Loss) در پی نداشته باشد. به عنوان مثال، تبدیل یک متغیر از نوع int (عدد صحیح) به double (عدد اعشاری) یک تبدیل ضمنی و امن است، زیرا هر عدد صحیحی را میتوان به عنوان یک عدد اعشاری (با بخش اعشار صفر) در نظر گرفت.
مثال تبدیل ضمنی:
int myAge = 30;
double preciseAge = myAge; // سیشارپ به طور خودکار myAge (int) را به double تبدیل میکند
// preciseAge حالا مقدار 30.0 را خواهد داشت.
Console.WriteLine(preciseAge);
2. تبدیل صریح (Explicit Conversion یا Casting): وقتی خودتان سکان را به دست میگیرید!
اما مواقعی هم وجود دارد که تبدیل یک نوع داده به نوع دیگر ممکن است منجر به از دست رفتن بخشی از اطلاعات شود. برای مثال، وقتی میخواهید یک عدد اعشاری (double) را به یک عدد صحیح (int) تبدیل کنید، بخش اعشاری آن عدد طبیعتاً حذف خواهد شد. در چنین مواردی، شما باید صراحتاً به کامپایلر سیشارپ اعلام کنید که “من از این تغییر و احتمال از دست رفتن داده آگاه هستم و مسئولیت آن را میپذیرم!”. به این عمل کستینگ (Casting) گفته میشود و با قرار دادن نام نوع مقصد در داخل پرانتز، قبل از نام متغیر یا عبارتی که میخواهید تبدیل کنید، انجام میشود.
مثال تبدیل صریح (Casting):
double productExactPrice = 49999.95;
// ما صراحتاً به C# میگوییم که میخواهیم productExactPrice را به int تبدیل کنیم
int roundedProductPrice = (int)productExactPrice;
// roundedProductPrice حالا مقدار 49999 را خواهد داشت (بخش اعشار .95 حذف شد).
Console.WriteLine(roundedProductPrice);
روشهای تکمیلی و پرکاربرد برای تبدیل انواع داده (بهویژه برای رشتهها)
علاوه بر کستینگ، سیشارپ ابزارهای دیگری نیز برای تبدیل انواع داده، خصوصاً برای کار با رشتهها، ارائه میدهد:
- کلاس Convert: این کلاس مجموعهای غنی از متدها را برای تبدیل انواع مختلف داده به یکدیگر فراهم میکند (مانند Convert.ToInt32(), Convert.ToDouble(), Convert.ToString(), Convert.ToBoolean() و غیره).
string numberString = "123"; int number = Convert.ToInt32(numberString);
- متد Parse: اکثر انواع داده عددی (و برخی دیگر مانند DateTime) دارای یک متد استاتیک به نام Parse() هستند. این متد یک رشته را به عنوان ورودی میگیرد و سعی میکند آن را به نوع داده مربوطه تبدیل کند (مثلاً int.Parse(“456”)). اگر رشته ورودی قابل تبدیل به آن نوع نباشد، یک استثنا (Exception) رخ خواهد داد.
string ageString = "25"; int age = int.Parse(ageString);
- متد TryParse: این متد نیز شبیه Parse عمل میکند، با این تفاوت مهم که اگر تبدیل موفقیتآمیز نباشد، به جای ایجاد استثنا، مقدار false را برمیگرداند و مقدار تبدیلشده (در صورت موفقیت) را از طریق یک پارامتر out در دسترس قرار میدهد. استفاده از TryParse روشی امنتر و کنترلشدهتر برای تبدیل رشتهها به سایر انواع است.
string priceString = "19.99";
double price;
if (double.TryParse(priceString, out price))
{
Console.WriteLine("قیمت با موفقیت تبدیل شد: " + price);
}
else
{
Console.WriteLine("رشته ورودی قابل تبدیل به قیمت معتبر نیست.");
}
- متد ToString: تقریباً تمامی انواع داده در سیشارپ (به لطف ارثبری از کلاس object) دارای متد ToString هستند. این متد، نمایش رشتهای آن نوع داده را برمیگرداند.
int quantity = 10; string quantityText = quantity.ToString(); // quantityText حاوی "10" خواهد بود.
اصول طلایی: بهترین شیوهها در استفاده از انواع دادهها در C#
برای نوشتن کدهای تمیز، بهینه، خوانا و عاری از خطا، رعایت نکات زیر هنگام کار با انواع داده در سیشارپ بسیار حائز اهمیت است:
- همیشه مناسبترین نوع داده را انتخاب کنید: این اصل اساسی هم به مصرف بهینه حافظه کمک شایانی میکند و هم سرعت اجرای برنامه شما را بهبود میبخشد. به عنوان مثال، اگر مطمئن هستید که یک متغیر عددی هرگز مقداری منفی یا خیلی بزرگ نخواهد داشت و همیشه در بازه 0 تا 255 قرار میگیرد، استفاده از byte به جای int یا long انتخاب هوشمندانهتری است.
- از var هوشمندانه و با دقت استفاده کنید: کلمه کلیدی var به شما اجازه میدهد تا نوع متغیر را به طور ضمنی توسط کامپایلر تعیین کنید، به شرطی که از مقدار اولیه اختصاص داده شده به آن، نوع متغیر کاملاً واضح و مشخص باشد (مثلاً var message = “خوش آمدید”; که کامپایلر به درستی message را از نوع string تشخیص میدهد). استفاده از var میتواند کد شما را در برخی موارد خلاصهتر کند. اما اگر نوع متغیر پیچیده است یا استفاده از var خوانایی کد را کاهش میدهد، بهتر است نوع متغیر را به صراحت مشخص کنید.
- تا حد امکان از تبدیلهای نوع (Type Casts) غیرضروری اجتناب کنید: هر عملیات تبدیل نوع، حتی اگر به نظر کوچک و بیاهمیت بیاید، یک سربار پردازشی (هرچند ناچیز) به برنامه شما تحمیل میکند. طراحی صحیح برنامه و انتخاب درست انواع داده از ابتدا، میتواند نیاز به تبدیلهای مکرر را کاهش دهد.
- برای مقادیر ثابت و تغییرناپذیر از const یا readonly استفاده کنید:
- const: برای تعریف مقادیری که مقدار آنها در زمان کامپایل برنامه مشخص و کاملاً ثابت است (مثلاً const double TaxRate = 0.09;). این مقادیر پس از تعریف، هرگز قابل تغییر نیستند.
- readonly: برای تعریف فیلدهایی در یک کلاس که مقدار آنها میتواند در زمان اجرای برنامه (معمولاً در سازنده یا constructor کلاس، یا هنگام تعریف فیلد) یک بار مقداردهی شود و پس از آن دیگر قابل تغییر نخواهد بود.
- برای محاسبات مالی و پولی، decimal انتخاب بیچون و چرای شماست: این نکته آنقدر مهم است که ارزش تکرار دارد! برای جلوگیری از هرگونه خطای گردکردن و تضمین دقت مطلق در محاسبات مرتبط با پول، همیشه از نوع داده decimal استفاده کنید.
تلههای رایج: اشتباهات متداول برنامهنویسان با انواع داده و راهحلهایشان
اشتباه رایج و پرتکرار | راهحل صحیح و اصولی |
استفاده از float یا double برای ذخیره و محاسبات مقادیر پولی و مالی. | همیشه و تحت هر شرایطی از decimal برای دقت حداکثری در محاسبات مالی استفاده کنید. |
استفاده از یک متغیر (بهویژه از انواع مرجعی) بدون مقداردهی اولیه، که میتواند منجر به خطای NullReferenceException شود. | همیشه متغیرها را قبل از اولین استفاده، با یک مقدار پیشفرض مناسب مقداردهی اولیه کنید. برای انواع مرجعی، قبل از دسترسی به اعضای آنها، null بودنشان را بررسی کنید. |
تلاش برای اختصاص مستقیم یک مقدار رشتهای به یک متغیر عددی (یا برعکس) بدون انجام تبدیل نوع. | از متدهای تبدیل مناسب مانند int.Parse(), double.TryParse(), Convert.ToInt32() یا متد .ToString() برای تبدیل امن و صحیح بین رشته و سایر انواع داده استفاده کنید. |
بروز خطای سرریز (Overflow Exception) هنگام انجام محاسبات روی اعداد، به دلیل انتخاب نوع داده با دامنه کوچک. | نوع دادهای با دامنه بزرگتر انتخاب کنید (مثلاً long به جای int اگر احتمال میدهید نتیجه محاسبه از محدوده int فراتر رود). برای کنترل سرریز، میتوانید محاسبات حساس را در یک بلوک checked قرار دهید تا در صورت بروز سرریز، یک استثنا ایجاد شود. |
عدم درک تفاوت بین انواع مقداری و مرجعی هنگام کپی کردن متغیرها یا ارسال آنها به متدها. | به خاطر داشته باشید که کپی کردن انواع مقداری، یک کپی از خود مقدار ایجاد میکند، اما کپی کردن انواع مرجعی، تنها مرجع (آدرس) را کپی میکند و هر دو به یک شیء در حافظه اشاره میکنند. |
پرسشهای متداول (FAQ) درباره انواع داده در سی شارپ
سوال ۱: تفاوت اصلی و کاربردی بین انواع داده float، double و decimal چیست؟
- float (Single-precision floating-point): دقت کمتری دارد (حدود ۶ تا ۷ رقم اعشار معنیدار) و فضای کمتری در حافظه اشغال میکند (۴ بایت). برای محاسباتی که دقت بسیار بالا حیاتی نیست و سرعت پردازش اهمیت بیشتری دارد (مثلاً در برخی محاسبات گرافیکی یا فیزیک بازیها) مناسب است.
- double (Double-precision floating-point): دقت متوسط و رایجتری دارد (حدود ۱۵ تا ۱۶ رقم اعشار معنیدار) و فضای بیشتری اشغال میکند (۸ بایت). این نوع، پیشفرض سیشارپ برای اعداد اعشاری است و تعادل خوبی بین دقت و عملکرد ارائه میدهد. برای اکثر محاسبات علمی و مهندسی عمومی مناسب است.
- decimal: بیشترین دقت را در بین این سه نوع دارد (حدود ۲۸ تا ۲۹ رقم اعشار معنیدار) و بیشترین فضا را نیز اشغال میکند (۱۶ بایت). این نوع داده به طور خاص برای محاسبات مالی، پولی و حسابداری طراحی شده است که حتی کوچکترین خطای گردکردن نیز میتواند منجر به نتایج نادرست و مشکلات جدی شود. دامنهی مقادیر decimal نسبت به double کوچکتر است، اما دقت آن به مراتب بیشتر است.
[H3] سوال ۲: آیا امکان ذخیره یک عدد صحیح در یک متغیر از نوع char (کاراکتر) وجود دارد؟
بله، این کار با استفاده از تبدیل صریح (کستینگ) امکانپذیر است. در این حالت، عدد صحیح به عنوان کد اسکی (ASCII) یا یونیکد (Unicode) آن کاراکتر تفسیر میشود.
int asciiCode = 65;
char character = (char)asciiCode; // character حالا مقدار 'A' را خواهد داشت،
// زیرا 65 کد اسکی حرف بزرگ A است.
Console.WriteLine(character); // خروجی: A
char anotherChar = (char)1588; // این کد یونیکد حرف 'ش' در فارسی است.
Console.WriteLine(anotherChar); // خروجی: ش
سوال ۳: بهترین و مناسبترین روش برای ذخیرهسازی اعداد بسیار بزرگ در سی شارپ چیست؟
- برای اعداد صحیح بسیار بزرگ: اگر با اعداد صحیح کامل (بدون اعشار) سروکار دارید که از محدوده int فراتر میروند، از نوع داده long (برای اعداد مثبت و منفی) یا ulong (فقط برای اعداد مثبت بسیار بزرگ) استفاده کنید.
- برای اعداد اعشاری با دامنه و دقت بسیار بزرگ: اگر نیاز به دامنه وسیعی از اعداد اعشاری دارید، double معمولاً گزینه مناسبی است. اما اگر دقت فوقالعاده بالا در کنار دامنه وسیع برایتان اولویت دارد (مثلاً در محاسبات علمی بسیار دقیق یا برخی محاسبات آماری پیچیده)، ممکن است نیاز به استفاده از کتابخانههای خاص برای کار با اعداد با دقت دلخواه (Arbitrary-precision arithmetic) مانند System.Numerics.BigInteger (برای اعداد صحیح با اندازه نامحدود) یا راهحلهای مشابه برای اعداد اعشاری داشته باشید، هرچند decimal برای اکثر نیازهای با دقت بالا کافی است.