آموزش جامع برنامهنویسی C# (انواع داده)
وقتی قدم در دنیای برنامهنویسی با زبان شیرین سیشارپ میگذارید، یکی از اولین و بنیادیترین مفاهیمی که مثل آچار فرانسه به کارتان میآید، «انواع داده» یا همان Data Types است. اما انواع داده در C# چیست و چرا اینقدر در مرکز توجه قرار دارند؟ به زبان ساده، انواع داده به کامپیوتر میفهمانند که هر متغیر چه جور اطلاعاتی را میتواند در خود جای دهد. این اطلاعات میتوانند اعداد صحیح (مثل تعداد محصولات در انبار)، اعداد اعشاری (مانند قیمت یک کالا با تخفیف)، یک حرف تنها (مثلاً گرید دانشجو)، یا مقادیر منطقی درست/غلط (مانند وضعیت موجود بودن کالا) باشند. استفاده هوشمندانه و صحیح از انواع داده، فقط یک قانون خشک برنامهنویسی نیست؛ بلکه مزایای کلیدی برای شما به ارمغان میآورد: در این مقاله چه چیزهایی یاد میگیریم؟ (فهرست مطالب) در این راهنمای کامل، قدم به قدم با تمام جنبههای انواع داده در سی شارپ آشنا خواهید شد: انواع دادهها در C# چیست؟ یک نگاه عمیقتر! در زبان برنامهنویسی C#، هر متغیری که تعریف میکنید، باید پیش از استفاده، نوع داده آن به طور واضح مشخص شود. نمیتوانید متغیری داشته باشید که هویتش نامعلوم باشد! C# یک زبان برنامهنویسی strongly-typed (یا به فارسی، دارای نوعدهی قوی) است. این اصطلاح به چه معناست؟ یعنی اگر شما متغیری را مثلاً از نوع «عدد صحیح» تعریف کردید، دیگر نمیتوانید مستقیماً در آن «متن» ذخیره کنید (مگر اینکه فرآیند تبدیل نوع را طی کنید). هر متغیر تنها و تنها دادههایی از جنس و نوع خودش را میپذیرد. این سختگیری اولیه، شاید در ابتدا کمی دستوپاگیر به نظر برسد، اما در درازمدت، به شدت به کاهش خطاها و افزایش پایداری برنامههای شما کمک میکند. چگونه یک متغیر در C# تعریف کنیم؟ (سینتکس و مثال) سینتکس تعریف متغیر در C# قالب کلی برای تعریف یک متغیر در زبان سیشارپ به شکل زیر است: همچنین میتوانید ابتدا متغیر را تعریف کرده و سپس در جایی دیگر از کد به آن مقدار اختصاص دهید: مثالهای کاربردی از تعریف متغیر بیایید با چند مثال ساده، این موضوع را شفافتر کنیم: مثال عملی: انواع داده در یک برنامه واقعی سی شارپ برای درک بهتر، بیایید ببینیم چگونه انواع دادههای مختلف در یک برنامه ساده و کاربردی مورد استفاده قرار میگیرند: خروجی برنامه فوق به این صورت خواهد بود: دستهبندی اصلی انواع دادهها در C# در زبان سیشارپ، انواع دادهها را میتوان به سه دسته اصلی و مهم تقسیمبندی کرد: حالا به تفصیل هر یک را بررسی میکنیم: 1. انواع مقداری (Value Types) در سی شارپ این دسته از انواع داده، خودِ مقدار داده را به طور مستقیم در حافظه (در بخشی به نام Stack) ذخیره میکنند. تصور کنید یک جعبه دارید که خودِ شیء ارزشمند مستقیماً داخل آن قرار گرفته است. هنگامی که یک متغیر از نوع مقداری را به متغیر دیگری نسبت میدهید، یک کپی کامل از آن مقدار ایجاد و در متغیر جدید ذخیره میشود. تغییر در یکی، روی دیگری تأثیری ندارد. مهمترین و پرکاربردترین انواع مقداری عبارتند از: جدول خلاصه و کاربردی انواع داده عددی صحیح در 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) را ذخیره میکنند که داده واقعی در آنجا قرار گرفته است. مانند یک کارت ویزیت که آدرس دفتر کار روی آن نوشته شده، نه خودِ دفتر کار.نکته کلیدی اینجاست: وقتی یک متغیر از نوع مرجعی را به متغیر دیگری نسبت میدهید، تنها آن آدرس کپی میشود. در نتیجه، هر دو متغیر به یک مکان واحد در حافظه اشاره خواهند کرد. این یعنی اگر محتوای آن مکان را از طریق یکی از متغیرها تغییر دهید، متغیر دیگر نیز آن تغییر را مشاهده خواهد کرد! مهمترین و پرکاربردترین انواع مرجعی عبارتند از: 3. انواع اشارهگر (Pointer Types) در سی شارپ – برای کاربران حرفهای! این نوع دادهها نیز، همانند انواع مرجعی، آدرس حافظه یک متغیر دیگر را در خود نگه میدارند. اما تفاوت اصلی در نحوه کار با آنها و سطح دسترسی است. استفاده از اشارهگرها معمولاً در کدهایی که در محیط unsafe (ناامن) نوشته میشوند، صورت میگیرد.در برنامهنویسی متداول و روزمره با سیشارپ، مگر در موارد بسیار خاص (مانند نیاز به کار مستقیم با حافظه برای بهینهسازیهای سطح پایین، یا ارتباط با کتابخانههای نوشته شده به زبانهایی مثل C یا C++)، به ندرت با انواع اشارهگر سروکار خواهید داشت. مثال (صرفاً برای آشنایی اولیه): ⚠️ هشدار مهم: برای اینکه کد حاوی بلوک unsafe و اشارهگرها کامپایل و اجرا شود، باید در تنظیمات پروژه خود (معمولاً در بخش Build یا Compile)، گزینه “Allow unsafe code” را فعال نمایید. استفاده نادرست از اشارهگرها میتواند منجر به خطاهای جدی و ناپایداری برنامه شود. جادوگری با دادهها: تبدیل انواع داده به یکدیگر (Type Conversion) در C# در مسیر کدنویسی، بارها و بارها پیش میآید که نیاز پیدا میکنید دادهای از یک نوع خاص را به نوع دیگری تبدیل کنید. سیشارپ دو روش اصلی و مکانیزم هوشمند برای این منظور در اختیار شما قرار میدهد: 1. تبدیل ضمنی (Implicit Conversion): وقتی C# کار را برایتان راحت میکند! در برخی شرایط، سیشارپ به قدری هوشمند است که میتواند انواع داده را به طور خودکار و بدون نیاز به دخالت مستقیم شما به یکدیگر تبدیل کند. این اتفاق زمانی رخ میدهد که تبدیل از یک نوع به نوع دیگر کاملاً امن باشد و هیچگونه