مقدمه

تا اینجا در مورد پلتفرم .NET و معماری و اجزای تشکیل‌دهنده‌ی آن صحبت کردیم و دیدیم که برنامه‌های .NET فارغ از اینکه با چه زبانی نوشته شوند، چه روندی را طی می‌کنند تا به کدهای ماشین تبدیل شوند. پلتفرم .NET از زبان‌های C#، F# و VB به طور رسمی پشتیبانی می‌کند. این آموزش به زبان C# و استفاده از آن در بستر .NET اختصاص دارد و بنابراین، در درس پایانی فصل اول، یک معرفی گذرا از زبان C# و ویژگی‌های کلی این زبان برنامه‌نویسی ارائه می‌دهیم.

گرامر C#

از نظر گرامری، C# شباهت زیادی به زبان جاوا (Java) دارد اما با این حال، اینکه C# را تقلیدی از جاوا بدانیم، صحیح نیست. در حقیقت، هر دوی این زبان‌ها به خانواده زبان‌های C تعلق دارند و طبیعتاً گرامر مشابهی دارند؛ همانطور که بسیاری از زیرساخت‌های گرامری C# به ویژوال‌بیسیک و C++ و زبان‌های دیگر این خانواده نیز شباهت دارد.

به عنوان مثال، C# همانند ویژوال‌بیسیک از مفهوم پراپرتی (property) و آرگومان‌های انتخابی (optional arguments) پشتیبانی می‌کند و مانند C++ از مفاهیمی مانند اورلود کردن عملگرها (operator overloading) پشتیبانی می‌کند و البته در این زبان، ویژگی‌هایی مانند عبارات لامبدا (lambda expressions) و نوع‌های ناشناس (anonymous types) دیده می‌شود که در زبان‌های کلاسیکی مانند LISP یا Haskell یافت می‌شود. همچنین ویژگی‌هایی مانند پشتیبانی از LINQ که تنها در زبان‌های .NET دیده می‌شود. بنابراین C# از تلفیق بهترین ویژگی‌های چند زبان برنامه‌نویسی مطرح و حذف ویژگی‌های بحث‌برانگیز این زبان‌ها ساخته شده و لذا در نهایت، تبدیل به زبانی شده که به سادگیِ ویژوال‌بیسیک، به تر و تمیزیِ جاوا و (با کمی اغماض) به قدرت و انعطاف‌پذیریِ C++ است.

مهمترین ویژگی‌های C#

در اینجا به تعدادی از مهمترین ویژگی‌های کلیدی و پایه‌ای زبان C# اشاره می‌کنیم:

  • شی‌گرایی کامل. در C# هر چیزی به نوبه‌ی خود یک شیء محسوب می‌شود و اصول شی‌گرایی به کامل‌ترین شکل ممکن در این زبان پیاده‌سازی شده است.
  • سطح انتزاع متوسط. C# از برخی جهات شبیه زبان‌های سطح بالا و از برخی جهات دیگر شبیه زبان‌های سطح پایین است و می‌توان آن را جایی در میانه‌ی این مسیر تصور کرد.
  • سیستم نوع استاتیک یا Statically-typed System. نوع متغیرهای C# باید در زمان کامپایل مشخص باشد و امکان تغییر نوع یک متغیر در طول برنامه وجود ندارد. این رویکردی است که بیشتر در زبان‌های سطح پایین مانند C دیده می‌شود. البته در C# امکاناتی مانند کلمه کلیدی dynamic هم وجود دارد که امکان برنامه‌نویسی با رویکردی مشابه زبان‌های دینامیک را هم فراهم می‌کند اما C# در مجموع، در کار با داده‌ها یک زبان سخت‌گیر محسوب می‌شود.
  • مدیریت خودکار حافظه (automatic memory management) با استفاده از ابزاری به نام Garbage Collector یا زباله‌روب. از این نظر، C# مشابه زبان‌های سطح بالایی مانند Python و Ruby است و در مقابل زبان‌های سطح پایینی مانند C++ که مدیریت حافظه و آزاد کردن حافظه‌ی بلااستفاده در آنها به عهده‌ی خود برنامه‌نویس است.
  • پشتیبانی از ویژگی اورلود کردن عملگرها برای یک نوع دلخواه بدون هیچ گونه پیچیدگی. این ویژگی باعث می‌شود بتوانیم نقش یک عملگر را به عملوندهایش وابسته کنیم؛ یعنی اینکه یک عملگر چه کاری انجام دهد به این بستگی داشته باشد که عملوندهایش از چه نوعی باشند.
  • پشتیبانی از برنامه‌نویسی مبتنی بر صفت یا Attribute-based Programming.
  • امکان ساخت نوع‌ها و اعضای جنریک. این ویژگی کمک قابل توجهی به افزایش راندمان برنامه و امنیت نوع (type safety) می‌کند.
  • پشتیبانی از برنامه‌نویسی موازی و غیرهمزمان. کلمات کلیدی async و await کار برنامه‌نویسی غیرهمزمان را بسیار ساده می‌کنند.

علاوه بر ویژگی‌های مذکور، C# ویژگی‌های متعدد و قابل ذکر دیگری مانند امکان تعریف نوع‌ها و اعضای ناشناس، پشتیبانی از تکنولوژی LINQ، امکان تعریف نوع‌ها و اعضای استاتیک و غیره نیز دارد که در طول این دوره‌ی آموزشی با آنها آشنا می‌شویم.