# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework > مقاله: #C برای برنامه نویسان ++C

## csvbcscp

*#C برای برنامه نویسان ++C**مقایسه بین++C و #C بدون استفاده از clr/*مطالب زیر شامل مهم ترین تفاوت های بین
*++C و #C است(بدون استفاده از clr/)، اگر شما برنامه نویس ++C باشید این مطلب می تواند مهم ترین تفاوت ها دو زبان را در یک نگاه به شما نشان دهد.**تفاوت ارث بری در ++C و #C*کلاس ها و سا ختار ها در ++C تقریباً یکسان هستند، در حالی که در #C کمی با هم فرق می‌کنند. از طریق کلاس ها در #C می‌توانید به هر تعدادی که می خواهید interface پیاده‌سازی کنید، اما تنها از یک کلاس می‌تواند ارث بری داشته باشید، همچنین ساختار ها در #C از ارث بری پشتیبانی نمی‌کنند و نمی‌توانید در آن به صورت صریح سازنده پیش‌فرض تعریف کنید(یکی از آنها به طور پیش فرض ارائه شده)
*تفاوت آرایه ها در ++C و #C*در ++C آرایه ها فقط یک اشاره‌گر هستند، اما در #C آرایه ها یک شی هستند که دارای متد و خاصیت هستند. برای مثال در #C، آرایه درای خاصیت Length است که اندازه آرایه را نشان می‌دهد. آرایه ها در #C از اندیس ها هم پشتیبانی می‌کنند و میتوانید از طریق اندیس برای دسترسی به خانه های آرایه استفاده کنید. سینتکس تعریف آرایه ها در سی‌شارپ و ++C هم متفاوت است. علامت “[]” که بعد از نوع آرایه در سی‌شارپ می‌آید هیچگاه تغییر نمی‌کند.
*تفاوت نوع Boolean در ++C و #C*در ++C نوع bool اساساً یک نوع عدد صحیح است اما در #C اینگونه نیست ونمیتوانید هیچگونه تبدیلی بین نوع داده bool و سایر انواع داده ای انجام دهید.
*تفاوت نوع long در ++C و #C*نوع داده long در سی‌شارپ 64 بیتی است، اما در Microsoft ++C ، 32 بیتی است.
*تفاوت ارسال پارامتر ها در #C و ++C*در ++C همه متغیر ها به صورت by value ارسال می‌شوند مگر اینکه صراحتاً مشخص کنیم که می خواهیم توسط اشاره گر یا refrence ارسال شود.در #C کلاس ها به طور پیش فرض by referenceهستند و ساختار ها نیز به صورت پیش فرض by vlue هستند. مگر اینکه )از طریق ref یا ( outبه صورت صریح مشخص کنیم که می خواهیم by refrence باشند.
*تفاوت دستور switch در #C و ++C*بر خلاف ++C در #C نمیتوانید از یک case به case دیگر پرش داشته باشید.
*Delegate ها در #C :*Delegate ها در #C تقریباً شبیه اشاره گر به توابع در ++C هستند(Delegate ها امن و type-safe هستند)
*کلمه کلیدی base در #C*در #C از کلمه کلیدی base برای فراخوانی متد های کلاسی که override کرده ایم استفاده می کنیم.(برای override کردن در #C از کلمه کلیدی override استفاده می‌کنیم)

*مخفی کردن متد ها با استفاده از new در #C*++C به صورت صریح از مخفی کردن(hiding) متد ها در ارث بری پشتیبانی میکند، در #C نیز میتوانید با استفاده از کلمه کلیدی new اعضای کلاس به ارث برده شده را مخفی نمایید.
*رهنمود های پیش پردازنده در #C*در #C از فایل های هدر استفاده نمیکنیم. رهنمودهای پیش پردازنده برای کامپایل شرطی در #C مورد استفاده قرار میگرد.
*try-finally و try-catch-finally در #C*#C دارای کلمه کلیدی finally است، کلمه کلیدی finally برای اجرای کدی که حتما” باید اجرا شود، حتی اگر استتثنایی وجود داشته باشد، استفاده می شود.

*عملگر های #C*#C علاوه بر عملگر های & ، | و ^ دو عملگر اضافی با نام is و typeof دارد. که کاربرد زیادی در بعضی عبارت های منطقی دارد.
*رهنمود using در#C*معادل کلمه کلیدی typedef در ++C است.در ++C از کلمه کلیدی typedef برای کوتاه تر کردن یا راحت تر کردن نام انواع داده ای که قبلاً تعریف شده است بکار میرود.
*extern*در ++C از کلمه کلیدی extern برای import کردن انواع داده ای استفاده میشود. اما در #C استفاده ی محدود تری دارد و فقط برای اعلان متدی که از یک فایل خارجی(external) است، استفاده می‌شود.
*static*کلمه کلیدی Static در ++C هم برای کلاس ها و هم برای انواع داده ای استفاده میشود، اما در #C فقط برای تعریف کلاس های استاتیک مورد استفاده قرار میگیرد.
*متد Main و آرگومان های خط فرمان*متد Main در #C با متد main در ++C متفاوت است، در #C با M بزرگ شروع میشود و همیشه static است. و همچنین #C دارای پردازش خط فرامان به مراتب قوی تری نسبت به ++C است.
*unsafe*ما اجازه استفاده کردن از اشارهگر ها را در #C نداریم مگر اینکه از حال unsafe استفاده کنیم.
*Operator ها*سربار گذاری اپراتور ها در #C با ++C متفاوت است.
*string*نوع داده string در ++C فقط آرایه ای از کاراکتر هاست در صورتی که string در #C یک شی است که از متدهای جستجوی قدرتمندی پشتیبانی می‌کند.
*foreach*از کلمه کلیدی foreach برای پیمایش در بین آرایه ها و مجموعه ها در #C استفاده می‌شود.
*ساختار اصلی برنامه های #C*#C از متد و متغیرهای سراسری(global) پشتیبانی نمی‌کند. متد ها و متغیر ها حتماً باید درون یک کلاس یا ساحتار تعریف شوند.
*static، const و enum*رهنمود پیش پردازنده #defineدر ++C معمولاً برای تعریف مقادیر ثابت استفاده می‌شود. اما در #C راه های بهتری برای این کار وجود دارد مثل enum یا تعریف یک عضو استاتیک در کلاس یا ساختار. و اگر میخواهید چندین مقدار ثابت در برنامه خود بگنجانید میتوانید از یک کلاس جداگانه برای تعریف تمامی مقادیر ثابت استفاده کنید.
*using و متا دیتا در #C*Import کردن type ها: در ++C، نوع های مشترک درون فایل های هدر قرار میگیرند. اما در #C این اطلاعات توسط متادیتا قابل دسترس هستند.
*متد ها*متغیر های محلی در #C قبل از استفاده باید مقدار دهی شوند.
*Garbage Collector*در ++C هر شی که ایجاد میشود باید پس از استفاده free شود، اما در #C این کار توسط Garbage Collector انجام می‌‌شود
*Destructor یا مخرب ها*برای آزاد سازی منابع مدیریت نشده، #C داری سینتکس متفاوتی نسبت به ++C است.
*Constructor یا سازنده*مانند ++C در #C هم وقتی یک سازنده معرفی نکنیم، سازنده‌ی پیش‌فرض فراخوانی می‌شود.
*Bit Field در ++C*#C از Bit Field پشتیبانی نمی کند.
سرویس های ورودی / خروجی و قالب بندی در #C به کتابخانه زمان اجرای دات نت بستگی دارد.
*خطای CS0241 در #C*پارامتر های متد در #C نمی‌توانند دارای مقادیر پیش فرض باشند. برای انجام این کار باید متد ها را overload کنید.
*Genericها در #C*generic ها در #C هم شبیه template ها در ++C است . اما پیچیدگی های به مراتب کمتری نسبت به template ها در ++C دارد. در مقابل template ها در ++C قابلیت ها بیشتری نسبت به جنریک ها در #C دارد.

----------

