معرفی زبان برنامه نویسی سی شارپ – C Sharp

معرفی زبان برنامه نویسی سی شارپ

معرفی زبان برنامه نویسی سی شارپ –  C Sharp یا C#

زبان برنامه نویسی سی شارپ (زبان برنامه نویسی C# یا C Sharp) یک زبان برنامه نویسی چند شیوه ای است که شامل اصول وابستگی زیاد به نوع (Strong Typing)، دستوری، اعلانی، تابعی، جنریک یا جامع، شی گرا (مبتنی بر کلاس) و مبتنی بر کامپوننت است. زبان برنامه نویسی سی شارپ توسط شرکت مایکروسافت در پروژه .NET توسعه یافت و بعدها توسط استانداردهای Ecma و ISO به عنوان یک زبان برنامه نویسی استاندارد مورد تایید قرار گرفت. سی شارپ یکی از زبان های برنامه نویسی است که برای زیرساخت زبان مشترک طراحی شده است.

زبان برنامه نویسی سی شارپ

زبان برنامه نویسی C# یک زبان برنامه نویسی همه منظوره و شی گرا است. تیم توسعه آن توسط آندرس هایلسبرگ هدایت می شود. آخرین ورژن این زبان برنامه نویسی C# 7.0 است که در سال 2017 به همراه Visual Studio 2017 عرضه شده است.

محصولات آموزشی مرتبط با این مقاله :
صفر تا صد آموزش برنامه نویسی در یونیتی با سی شارپ – پک 1
صفر تا صد آموزش برنامه نویسی در یونیتی با سی شارپ – پک ۲
صفر تا صد آموزش زامارین

اهداف طراحی

در استاندارد ECMA فهرست زیر به عنوان اهداف زبان برنامه نویسی سی شارپ مشخص شده است:

  • این زبان باید یک زبان برنامه نویسی ساده، مدرن، همه منظوره و شی گرا باشد.
  • این زبان برنامه نویسی و پیاده سازی های آن باید از اصول مهندسی نرم افزار مانند بررسی وابستگی زیاد به نوع، بررسی محدوده آرایه، شناسایی تلاش برای استفاده از متغیرهای مقداردهی نشده و بازیافت حافظه خودکار پشتیبانی کند. مواردی مانند استحکام نرم افزاری، پایداری و بهره وری برنامه نویس از اهمیت زیادی برخوردار هستند.
  • زبان برنامه نویسی سی شارپ برای استفاده در توسعه کامپوننت های نرم افزاری در نظر گرفته شده است که برای توسعه در محیط های توزیع شده مناسب هستند.
  • قابل حمل بودن برای کد منبع و برنامه نویس ها از اهمیت بالایی برخوردار است، مخصوصا برای کسانی که از قبل با زبان های برنامه نویسی C و C++ آشنایی دارند.
  • پشتیبانی از بین المللی سازی بسیار مهم است.
  • زبان برنامه نویسی C# باید برای نوشتن برنامه ها برای سیستم های میزبانی شده و سامانه های نهفته مناسب باشد. این سیستم ها شامل سیستم های خیلی بزرگ که از سیستم عامل های پیچیده استفاده می کنند تا سیستم های خیلی کوچک است که کارایی های مشخصی دارند.
  • گرچه برنامه های سی شارپ باید از نظر ملزومات حافظه و قدرت پردازش اقتصادی عمل کنند، اما خود این زبان برای رقابت مستقیم از نظر عملکرد با زبان C یا Assembly طراحی نشده است.

تاریخچه زبان برنامه نویسی C#

در طی فرایند توسعه فریم ورک .NET، کتابخانه های کلاس در ابتدا توسط یک سیستم کامپایلر با کد مدیریت شده به نام Simple Managed C (SMC) نوشته شده بودند. در ژانویه سال 1999، آندرس هایلسبرگ یک تیم تشکیل داد تا یک زبان برنامه نویسی جدید به نام Cool بسازد که مخفف C-like Object Oriented Language یا “زبان شی گرای مانند C” بود. شرکت مایکروسافت قصد داشت نام Cool را به عنوان نام نهایی این زبان نگه دارد، اما به خاطر دلایل مربوط به علامت تجاری از این کار صرف نظر کرد. زمانی که پروژه .NET در کنفرانس توسعه دهندگان حرفه‌ای در جولای سال 2000 به طور عمومی اعلام شد، این زبان به C# تغییر نام داده شد و کتابخانه های کلاس و ASP.NET Runtime به C# انتقال داده شدند.

طراح اصول زبان برنامه نویسی سی شارپ و معمار ارشد شرکت مایکروسافت، آندرس هایلسبرگ است که در گذشته در طراحی Turbo Pascal، Embarcadero Delphi (در گذشته CodeGear Delphi، Inprise Delphi و Borland Delphi) Visual J++ دست داشت. وی در محاصبه ها و مقالات فنی اظهار کرده است که نقایص بیشتر زبان های برنامه نویسی اصلی (مانند C++، Java، Delphi و Smalltalk)، اصول اولیه زمان اجرای زبان مشترک (Common Language Runtime – CLR) را بنا نهادند که بعدها باعث طراحی زبان C# شد.

زبان برنامه نویسی جاواجیمز گاسلینک که در سال 1994 زبان برنامه نویسی جاوا را ساخت و بیل جوی که یکی از موسس های شرکت Sun Microsystems است، زبان برنامه نویسی C# را یک تقلید از جاوا دانستند. جیمز گاسلینگ در ادامه اظهار داشت که “سی شارپ به نوعی همان جاوا است که قابلیت اطمینان، خلاقیت و امنیت از آن حذف شده است”. کلاوس کرفت و آنجلیکا لانگر (مولفان کتاب های C++ streams) در یک پست وبلاگ اظهار کردند که “جاوا و سی شارپ تقریبا زبان های برنامه نویسی یکسانی هستند و این یک تکرار کسل کننده بدون نوآوری است. افراد کمی ادعا خواهند کرد که جاوا و C# زبان های برنامه نویسی انقلابی هستند که شیوه نوشتن برنامه ها را تغییر داده اند. زبان سی شارپ بسیاری از چیزها را از جاوا گرفته است و بالعکس. اکنون که C# از قابلیت های Boxing و Unboxing پشتیبانی می کند، در جاوا هم ویژگی های بسیار مشابهی اضافه خواهد شد”. در جولای سال 2000، آندرس هایلسبرگ گفت که “زبان سی شارپ تقلید از جاوا نیست و طراحی آن بیشتر به زبان C++ نزدیک است”.

سی شارپ و جاوا

از زمان عرضه C# 2.0 در نوامبر سال 2005، زبان های سی شارپ و جاوا مسیرهای تکامل متفاوتی را پیش گرفته اند و شباهت آنها به هم کمتر شده است. یکی از تفاوت های اصلی آنها با اضافه شدن Generic ها به هر دو زبان با کاربردهای بسیار متفاوت آغاز شد. زبان برنامه نویسی سی شارپ از جسمیت دادن استفاده می کند تا اشیای جنریک کلاس اول فراهم کند که از آنها می توان مانند هر کلاس دیگری استفاده کرد و تولید کد در زمان لود شدن کلاس انجام می شود. به علاوه، C# چندین ویژگی مهم اضافه کرده است تا برنامه نویسی به سبک تابعی را تطبیق دهد و با افزونه های LINQ که در C# 3.0 عرضه شد و با پشتیبانی فریم ورک از عبارات Lambda و نوع های ناشناس، به اوج خود رسید. این ویژگی ها به برنامه نویس C# اجازه می دهند تا در صورت مفید بودن برای برنامه اش، از تکنیک های برنامه نویسی تابعی مانند closure ها استفاده کند. افزونه های LINQ و Import های تابعی به توسعه دهندگان کمک می کنند تا مقدار کدهای تکراری که در کارهای رایج مانند پرس و جو از یک پایگاه داده، تجزیه یک فایل xml یا جستجو در یک ساختار داده استفاده می شوند را کاهش دهند و بیشتر روی منطق برنامه تمرکز کنند تا خوانایی و قابلیت نگهداری را بهبود دهند.

زبان برنامه نویسی C# در گذشته یک نماد به نام اندی (برداشت از آندرس هایسلبرگ) داشت که در 29 ژانویه سال 2004 بازنشسته شد.

زبان برنامه نویسی C# در ابتدا برای بررسی در کمیسیون فرعی ISO JTC 1/SC 22 ثبت شده بود، اما از آن خارج شد و تحت تایید ISO/IEC 23270:2006 قرار گرفت.

نام

نام سی شارپ “C Sharp” برگرفته از نت موسیقایی است که علامت # نشان می دهد که گام نت نوشته شده باید نیم پرده بالاتر نواخته شود. این مانند زبان برنامه نویسی C++ است که علامت ++‌ نشان می دهد که یک متغیر باید به علاوه مقدار 1 گردد. علامت # همچنین نمایانگر یک لیگچر با چهار علامت +‌ است (در یک شبکه دو در دو) که نشان می دهد این زبان توسعه ای بر C++‌ است.

علامت شارپ یا دیز در موسیقی

به دلیل محدودیت های فنی برای نمایش (فونت های استاندارد، مرورگرها و غیره) و اینکه نماد شارپ (U+266F ♯) در بیشتر کیبوردها موجود نیست، نماد عدد (U+0023 #) به صورت تقریبی انتخاب شد تا نمایانگر نماد شارپ در نام این زبان برنامه نویسی باشد. این تبدیل نماد در مشخصات زبان سی شارپ ECMA-334 آورده شده است. هرچند در صورت عملی بودن (مثلا برای تبلیغات یا روی جعبه ها)، مایکروسافت از همان نماد موسیقایی اصلی استفاده می کند.

پسوند شارپ توسط تعدادی از دیگر زبان های .NET که تنوعی از زبان های موجود هستند نیز استفاده شده است، از جمله J# (یک زبان .NET که توسط مایکروسافت طراحی شده است و برگرفته از Java 1.1 است)، A# (برگرفته از ADA) و زبان برنامه نویسی تابعی F#. نسخه اولیه Eiffel for .NET به نام Eiffel# نامیده میشد. این نام اکنون منسوخ شده است، زیرا زبان کامل Eiffel پشتیبانی می شود. از این پسوند همچنین برای کتابخانه هایی مانند Gtk# (یک الگوی آداپتور .NET برای GTK+ و دیگر کتابخانه های GNOME) و Cocoa# (یک الگوی آداپتور برای Cocoa) استفاده شده است.

ورژن های زبان برنامه نویسی سی شارپ

جدول ورژن ها

ویژگی های اضافه شده در ورژن های مختلف

C# 2.0

  • جنریک ها
  • نوع های جزئی
  • متدهای ناشناس
  • تکرار کننده ها
  • نوع های Nullable
  • دسترسی جداگانه Getter/setter
  • تبدیل های گروهی متد (delegate ها)
  • متغیرهای مشترک و متقابل برای delegate ها
  • کلاس های استاتیک
  • استنباط delegate

C# 3.0

  • متغیرهای Local با نوع مشخص
  • مقداردهنده های اولیه Object‌ و Collection
  • خصوصیات اجرا شده خودکار
  • نوع های ناشناس
  • متدهای Extension
  • عبارات Query
  • عبارات Lambda
  • درخت های Expression
  • متدهای جزئی

C# 4.0

  • اتصال دینامیک
  • آرگومان های نام گذاری شده و اختیاری
  • Covariance و Contravariance جنریک
  • نوع های Embedded interop

C# 5.0

  • متدهای ناهمگام
  • خصیصه های Caller Info

C# 6.0

  • کامپایلر به عنوان یک سرویس (Roslyn)
  • وارد کردن اعضای نوع استاتیک به Namespace
  • فیلترهای استثنا
  • انتظار در بلوک های catch/finally
  • مقداردهنده های اولیه با خصوصیت خودکار
  • مقادیر پیش فرض برای خصوصیاتی که تنها getter دارند
  • اعضای Expression-bodied
  • تکثیر دهنده Null (عملکرد شرطی Null یررسی Null مختصر)
  • درون یابی رشته
  • عملگر nameof
  • مقداردهنده اولیه دیکشنری

C# 7.0

  • Literal های دودویی
  • تفکیک کننده های رقم
  • توابع Local
  • Type switch
  • Return های Ref
  • تاپل های نام گذاری شده
  • Out var
  • تطبیق الگو
  • Return های Asynch اختیاری
  • Getter ها و Setter های Expression bodied
  • Constructor ها و finalizer های Expression bodied

زبان برنامه نویسی سی شارپ

قاعده نحوی

قاعده نحوی اصلی زبان برنامه نویسی C# مانند دیگر زبان های سبک C ‌است، مانند C، C++‌ و جاوا.

  • از نقطه ویرگول برای مشخص کردن انتهای عبارت استفاده می شود.
  • از آکولادها برای گروه بندی عبارت ها استفاده می شود. عبارات معمولا در داخل متدها (توابع)، توابع در داخل کلاس‌ها و کلاس ها در داخل Namespaceها گروه بندی می شوند.
  • متغیرها توسط علامت مساوی تخصیص داده می شوند، اما با استفاده از دو علامت مساوی مقایسه می شوند.
  • از کروشه ها برای ارایه ها استفاده می شود، هم برای اعلان کردن آنها و هم برای گرفتن یک مقدار در شاخص خاصی از آنها.

ویژگی های بارز زبان برنامه نویسی C#

برخی از ویژگی های بارز C# که آن را از C، C++ و جاوا متمایز می کنند شامل موارد زیر است:

قابلیت حمل

زبان برنامه نویسی سی شارپ طوری طراحی شده است که مستقیما نمایانگر زیرساخت زبان مشترک است. بیشتر نوع های درونی آن متناظر با نوع های مقداری است که توسط فریم ورک CLI بکار گرفته شده است. هرچند در مشخصات زبان، ملزومات تولید کد کامپایلر آورده نشده است، یعنی نگفته است که یک کامپایلر C# باید یک Runtime زبان مشترک را هدف قرار دهد یا زبان واسطه مشترک تولید کند یا هر فرمت خاص دیگری را تولید کند. به صورت تئوری، یک کامپایلر C#‌ می تواند مانند کامپایلرهای سنتی C++ یا Fortran، کدهای ماشینی تولید کند.

وابستگی به نوع

زبان برنامه نویسی سی شارپ از اعلان های متغیرهای ضمنی وابسته زیاد به نوع با کلمه کلیدی var  و از آرایه های نوع ضمنی با کلمه کلیدی new []  به همراه یک آغازگر Collection پشتیبانی می کند.

زبان برنامه نویسی سی شارپ از یک نوع داده بولی محض با کلمه کلیدی bool  پشتیبانی می کند. عبارات شرطی مانند while  و if  نیازمند یک Expression از نوعی هستند که از عملگر true  استفاده می کند، مانند نوع بولی. با اینکه C++ یک نوع بولی دارد، می توان آن را آزادانه به اعداد صحیح تبدیل کرد و Expressionهایی مانند if(a)  تنها نیاز به این دارند که a  قابل تبدیل به bool باشد و اجازه می دهند a  یک int یا یک نشانگر باشد. زبان برنامه نویسی سی شارپ اجازه این رویکرد “اعداد صحیح به معنی true یا false” را نمی دهند، به این دلیل که وادار کردن برنامه نویس ها به استفاده از عباراتی که نتیجه آنها دقیقا bool  است می تواند از بروز برخی مشکلات برنامه نویسی جلوگیری کند، مانند if (a = b)  (استفاده از اختصاصگر =  به جای برابری ==  که با اینکه در C یا C++ یک خطا نیست، توسط کامپایلر مشخص می شود).

زبان برنامه نویسی C# بیشتر از C++ ایمنی نوع دارد. تنها تبدیل های ضمنی پیش فرض آنهایی هستند که ایمن هستند، مانند گسترش دادن اعداد صحیح. این کار در زمان کامپایل کردن، هنگام JIT و گاهی مواقع هنگام اجرا صورت می گیرد. هیچ تبدیل ضمنی بین مقادیر بولی و اعداد صحیح صورت نمی گیرد، همچنین بین اعداد شمارشی و اعداد صحیح (به جز مقدار Literal صفر که می توان آن را به طور ضمنی به هر نوع شمارشی تبدیل کرد). هر نوع تبدیل توسط کاربر باید به عنوان واضح یا ضمنی مشخص شود، برخلاف Constructorهای کپی و عملگرهای تبدیل C++ که هر دو به طور پیش فرض ضمنی هستند.

زبان برنامه نویسی C# از covariance و contravariance در نوع های جنریک بوضوح پشتیبانی می کند، برخلاف C++ که تنها از طریق معناشناسی نوع های Return در متدهای مجازی تا حدی از contravariance پشتیبانی می کند.

اعضای Enumeration در Scope مربوط به خود قرار داده می شوند.

زبان برنامه نویسی C# اجازه متغیرها یا توابع Global را نمی دهد. تمام متدها و اعضا باید در داخل کلاس ها اعلان شوند. اعضای استاتیک از کلاس های Public می توانند جایگزین متغیرها و توابع Global شوند.

متغیرهای Local نمی توانند متغیرهای بلوک محصور کننده را بپوشانند.

برنامه نویسی متا

برنامه نویسی متا از طریق خصیصه های C Sharp بخشی از این زبان است. بسیاری از این خصیصه ها، کارایی GCC ها و دایرکتیوهای پیش پردازنده مبتنی بر پلتفرم Visual C++ را تکثیر می کنند.

متدها و توابع

مانند C++ و برخلاف جاوا، برنامه نویس های C Sharp باید از کلمه کلیدی Virtual  استفاده کنند تا اجازه دهند متدها توسط زیرکلاس ها بازنویسی و Override شوند.

متدهای Extension در C# به برنامه نویس ها اجازه می دهند از متدهای استاتیک استفاده کنند، مانند اینکه آنها از جدول متدهای یک کلاس گرفته شده باشند و به برنامه نویس ها اجازه می دهند به یک شی متدی اضافه کنند که حس می کنند باید روی آن شی و مشتقات آن وجود داشته باشد.

نوع dynamic  اجازه اتصال متد Run-time‌ را می دهد و اجازه فراخوانی های متد مانند جاوا اسکریپت و ترکیب بندی شی در زمان اجرا را می دهد.

زبان برنامه نویسی C# از نشانگرهای تابع با وابستگی زیاد به نوع از طریق کلمه کلیدی delegate  پشتیبانی می کند. مانند Signal‌ و Slot شبه C++ مربوط به فریم ورک Qt، سی شارپ هم دارای معناشناسی در زمینه رویدادهای به سبک Publish-Subscribe‌ است، البته C#‌ برای این کار از delegate ها استفاده می کند.

زبان برنامه نویسی سی شارپ فراخوانی های متد synchronized  جاوا مانند از طریق [MethodImpl(MethodImplOptions.Synchronized)]  دارد و از طریق کلمه کلیدی lock  از قفل های منحصر متقابل پشتیبانی می کند.

Property

زبان برنامه نویسی سی شارپ Property هایی به عنوان شکر نحوی برای یک الگوی رایج ارائه می کند که در آن یک جف متد، accessor (getter) و mutator (setter) عملیات ها را روی یک خصیصه از یک کلاس محصور می کنند. نیازی به نوشتن متدهای اضافی برای بکارگیری getter/setter وجود ندارد و به جای فراخوانی های متد طولانی، از طریق قاعده نحوی خصیصه می توان به property دست یافت.

Namespace

یک namespace  سی شارپ همان سطح از انزوای کد را مانند Package  در جاوا یا namespace  ‌در C++ ارائه می کند که قوانین و ویژگی های آن بسیار مشابه package  است.

دسترسی به حافظه

در زبان برنامه نویسی C#، از نشانگرهای آدرس حافظه تنها می توان در بلوک هایی استفاده کرد که به عنوان unsafe علامت گذاری شده اند و برنامه هایی که کدهای unsafe یا ناامن دارند برای اجرا شدن نیاز به مجوزهای مناسب دارند. بیشتر دسترسی به object‌ از طریق رفرنس ایمن به object انجام می شود که همیشه یا به یک object زنده اشاره دارد یا دارای مقدار null است. گرفتن رفرنس به یک object مرده (یک object که بازیابی شده است) یا یک بلوک تصادفی از حافظه غیرممکن است. یک نشانگر unsafe می تواند به یک نمونه از نوع مقداری، آرایه، رشته یا یک بلوک از حافظه که در یک Stack ‌تخصیص داده شده است، اشاره داشته باشد. کدی که به عنوان unsafe علامت گذاری نشده است هنوز می تواند نشانگرها را از طریق نوع System.IntPtr  ذخیره و دستکاری کند، اما نمی تواند رفرنس آنها را حذف کند.

حافظه مدیریت شده را نمی توان به طور واضح آزاد کرد، به جای آن به صورت خودکار بازیافت می گردد. Garbage collection یا بازیافت با برداشتن وظیفه آزاد کردن حافظه ای که دیگر مورد نیاز نیست از روی دوش برنامه نویس، مشکل نشت حافظه را رفع می کند.

استثنا

استثنائات چک شده در زبان برنامه نویسی سی شارپ وجود ندارند (برخلاف جاوا). این یک تصمیم عمدی براساس مشکلات مقیاس پذیری و ورژن پذیری بوده است.

چند ریختی

برخلاف C++، زبان برنامه نویسی C# از وراثت چندگانه پشتیبانی نمی کند، البته یک کلاس می تواند از هر تعداد رابط کاربری استفاده کند. این تصمیم توسط معمار ارشد این زبان گرفته شد تا از پیچیدگی جلوگیری شود و ملزومات معماری از طریق CLI ساده شوند. موقع به کارگیری چندین رابط کاربری که شامل یک متد با امضای مشابهی هستند، C#‌ اجازه می دهد هر متد را بسته به اینکه آن متد از طریق کدام رابط کاربری فراخوانی شده است، بکار بگیریم یا مانند جاوا، اجازه می دهد یک بار متد را به کار بگیریم و آن تنها فراخوانی از طریق هر یک از رابط های کاربری کلاس باشد.

هرچند برخلاف جاوا، زبان برنامه نویسی سی شارپ از سربارگزاری عملگرها پشتیبانی می کند. تنها رایج ترین عملگرهای سربارگزاری شده در C++ می توانند در C# سربارگزاری شوند.

برنامه نویسی تابعی

با اینکه C Sharp در ابتدا یک زبان دستوری بود، C# 2.0 پشتیبانی محدودی از برنامه نویسی تابعی از طریق توابع کلاس یک و Closure ها به شکل delegate های ناشناس داشت. C# 3.0 پشتیبانی از برنامه نویسی تابعی را با معرفی یک قاعده سبک برای عبارت های Lambda، متدهای Extension (یک کارایی برای ماژول ها) و یک قاعده list comprehension به شکل زبان query comprehension، گسترش داد.

سیستم نوع رایج

زبان برنامه نویسی سی شارپ یک سیستم از نوع یکپارچه دارد. این سیستم نوع یکپارچه، سیستم نوع مشترک (Common Type System – CTS) نام دارد.

یک سیستم نوع یکپارچه دلالت بر این دارد که تمام نوع ها از جمله Primitive هایی مانند اعداد صحیح، زیرکلاسی از کلاس System.Object  هستند. برای مثال، هر نوعی یک متد ToString ()  را به ارث می برد.

دسته بندی های نوع های داده

CTS نوع های داده را به دو دسته تقسیم می کند:

  1. نوع های مرجعی
  2. نوع های مقداری

نمونه های نوع های مقداری دارای هویت ارجاعی یا معناشناسی مقایسه ارجاعی نیستند – مقایسه های برابری و عدم برابری برای نوع های مقداری، مقادیر حقیقی داده را در داخل نمونه ها مقایسه می کنند، مگر اینکه عملگرهای مربوطه سربارگزاری شده باشند. نوع های مقداری برگرفته از System.ValueType  هستند، همیشه یک مقدار پیش فرض دارند و همیشه می توانند ایجاد یا کپی شوند. چند محدودیت دیگر نوع های مقداری این است که نمی توانند از یکدیگر گرفته شوند (اما می توانند رابط ها را به کار گیرند) و نمی توانند یک constructor پیش فرض واضح (بدون پارامتر) داشته باشند. نمونه های نوع های مقداری تمام نوع های primitive مانند int  (یک عدد صحیح 32 بیتی)، float (یک عدد ممیز شناور IEEE 32 بیتی)، char  (یک واحد کد یونیکد 16 بیتی) و System.DateTime  (یک نقطه خاص در زمان با دقت نانوثانیه را شناسایی می کند) هستند. مثال های دیگر شامل enum  (enumerations) و struct  (ساختارهای تعریف شده توسط کاربر) هستند.

برعکس، نوع های مرجعی دارای مفهوم هویت ارجاعی هستند – هر نمونه از یک نوع مرجعی ذاتا متمایز از دیگر نمونه ها است، حتی اگر داده های داخل هر دو نمونه یکی باشد. این موضوع در مقایسه های پیش فرض برابری و عدم برابری برای نوع های مرجعی مشهود است که به جای برابری ساختاری، برابری ارجاعی را تست می کنند مگر اینکه عملگرهای مربوطه سربارگزاری شده باشند (مانند مورد System.String ). به طور کلی، همیشه ممکن نیست که یک نمونه از نوع مرجعی بسازیم یا یک نمونه موجود را کپی کنیم یا یک مقایسه مقداری بین دو نمونه موجود انجام دهیم، البته نوع های مرجعی خاصی می توانند با رو کردن یک Public Constructor یا بکارگیری یک رابط متناظر (مانند ICloneable  یا IComparable )، چنین خدماتی را ارائه کنند. مثال هایی از نوع های مرجعی شامل object  (کلاس مبنای نهایی برای تمام دیگر کلاس های C#)، System.String  (یک رشته از کاراکترهای یونیکد) و System.Array  (یک کلاس مبنا برای تمام آرایه های C#) هستند.

هر دو نوع قابل توسعه با نوع های تعریف شده توسط کاربر هستند.

Boxing‌ و Unboxing

Boxing، فرایند تبدیل یک شی نوع مقداری به مقدار یک نوع مرجعی متناظر است. عمل Boxing در زبان برنامه نویسی سی شارپ ضمنی است.

عمل Unboxing، فرایند تبدیل مقدار یک نوع مرجعی (که قبلا Boxed بوده) به مقدار یک نوع مقداری است. عمل Unboxing در C# نیازمند یک تبدیل نوع واضح است. یک شی Boxed از نوع T تنها می تواند به یک T (یا یک Nullable T) Unbox شود.

مثال:

int foo = 42;         // Value type.

object bar = foo;     // foo is boxed to bar.

int foo2 = (int)bar;  // Unboxed back to value type.

کتابخانه ها

مشخصات C Sharp یک مجموعه کمینه از نوع ها و کتابخانه های کلاس را مشخص کرده است که از کامپایلر انتظار می رود داشته باشد. در عمل، C Sharp در اکثر اوقات با بکارگیری کمی زیرساخت زبان مشترک مورد استفاده قرار می گیرد که به عنوان ECMA-335 Common Language Infrastructure استاندارد شده است.

زبان برنامه نویسی C#

مثال ها

کد زیر یک برنامه ساده C Sharp است که یک نسخه کلاسیک از مثال “Hello World” است:

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, world!");
    }
}

چیزی که در برنامه نمایش داده می شود، این است:

Hello, world!

هر خط، دارای یک هدف است:

using System;

کد بالا به کامپایلر می گوید که از System  به عنوان یک پیشوند برای نوع های استفاده شده در کد منبع استفاده کند. در این مورد وقتی کامپایلر بعدا استفاده از نوع Console در کد منبع را ببیند، سعی می کند یک نوع به نامد console  را ابتدا در مجموعه کنونی و سپس در تمام مجموعه های ارجاع شده، پیدا کند. در این مورد، کامپایلر نمی تواند چنین نوعی را پیدا کند، زیرا نام این نوع در واقع System.Console  است. سپس کامپایلر سعی می کند با استفاده از پیشوند system  از عبارت using ، یک نوع به نام System.Console  را پیدا کند و این بار موفق می شود. عبارت using ‌ به برنامه نویس اجازه می دهد به جای استفاده از اسامی کامل در تمام مواقع، تمام پیشوندهای نامزد برای استفاده در طی عمل کامپایل را اعلام کند.

class Program

کد بالا یک تعریف کلاس است. هر چیزی که بین کروشه های زیر باشد، program  را توصیف می کند.

static void Main(string[] args)

این متد class member را اعلام می کند که اجرای برنامه شروع می شود. .NET runtime متد Main  را فراخوانی می کند. (توجه: Main  را مانند بقیه متدها از جای دیگری هم می توان فراخوانی کرد. مثلا از یک متد دیگر یا از program ). کلمه کلیدی static  متد را بدون نمونه ای از program  قابل دسترسی می کند. تمام نقاط ورودی Main  از برنامه کنسول باید به عنوان static  اعلام شوند. در غیر این صورت برنامه به یک نمونه نیاز خواهد داشت، اما هر نمونه ای به یک program نیاز دارد. برای رفع این وابستگی دایره ای غیر قابل حل، اگر متد static Main  وجود نداشته باشد، کامپایلرهای C# که برنامه های کنسول را پردازش می کنند (مانند بالا) یک خطا گزارش می کنند. کلمه کلیدی void  اعلام می کند که main‌  دارای مقدار بازگشتی نیست.

Console.WriteLine("Hello, world!");

این خط از کد، خروجی را می نویسد. Console یک کلاس استاتیک در فضای نام system است. این یک رابط برای ورودی، خروجی و جریان های خطا برای برنامه های کنسول فراهم می کند. این برنامه، مند WriteLine  از console‌ را فراخوانی می کند که یک خط با آرگومان رشته “Hello World!” را روی کنسول نمایش می دهد.

یک مثال از رابط کاربری گرافیکی:

using System.Windows.Forms;

class Program
{
    static void Main(string[] args)
    {
        MessageBox.Show("Hello, World!");
        System.Console.WriteLine("Is almost the same argument!");
    }
}

 

این مثال مشابه مثال قبلی است، اما به جای نوشتن پیام “Hello World!” روی کنسول، یک دیالوگ باکس تولید می کند که آن پیام را نمایش می دهد.

استانداردسازی و صدور مجوز

در آگوست سال 2001، شرکت مایکروسافت، هیولت پاکارد و اینتل با هم ثبت مشخصات برای زبان برنامه نویسی سی شارپ و همچنین زیرساخت زبان مشترک در سازمان استاندارد Ecma International را حمایت کردند. در دسامبر سال 2001، سازمان ECMA مشخصات زبان ECMA-334 C# را منتشر کرد. زبان برنامه نویسی سی شارپ در سال 2003 تبدیل به استاندارد ISO شد. سازمان ECMA در گذشته مشخصات مشابهی را به عنوان دومین نسخه از C# در دسامبر سال 2002 به تصویب رسانده بود.

در ژوئن سال 2005، سازمان ECMA این استاندارد و گزارش های فنی مربوطه را از طریق فرایند Fast-Track در ISO/IEC JTC 1 ثبت کرد. این فرایند معمولا 6 تا 9 ماه زمان می برد.

تعریف زبان برنامه نویسی C# و CLI تحت استانداردهای ISO و ECMA استانداردسازی شده اند که حمایت مجوز منطقی و بدون تبعیض بر علیه ادعاهای ثبت اختراع ارائه می کنند.

شرکت مایکروسافت پذیرفته است که از توسعه دهندگان کد باز به خاطر نقض حق امتیاز بخشی از فریم ورک که تحت پوشش OSP است، برای پروژه های غیرتجاری شکایت نکند. شرکت مایکروسافت همچنین پذیرفته است که حق امتیازهای مربوط به محصولات شرکت Novell را علیه مشتریان Novell به اجرا نگذارد، به استثنای لیستی از محصولات که بوضوح اشاره ای به C#، .NET یا پیاده سازی Novell‌ از .NET ندارند. هرچند شرکت Novell اظهار دارد که Mono از هیچ یک از حق امتیازهای مایکروسافت تعدی نکرده است. شرکت مایکروسافت همچنین توافق کرده است که حقوق ثبت اختراع مربوط به پلاگین مرورگر Moonlight‌ را به اجرا نگذارد که به Mono وابسته است، درصورتی که از طریق شرکت Novell تهیه شده باشد.

پیاده سازی ها

مرجع کامپایلر سی شارپ، Microsoft Visual C# است که کد باز است.

شرکت مایکروسافت هدایت توسعه کامپایلر جدید C# کد باز و مجموعه ابزارهایی که اسم رمز آن در گذشته Roslyn بوده است را برعهده دارد. این کامپایلر که کاملا با کد مدیریت شده (C Sharp) نوشته شده است باز شده است و کارایی آن به عنوان API ها رو شده است. بنابراین توسعه دهندگان را قادر کرده است تا ابزارهای فاکتورگیری مجدد و عیب یابی بسازند.

فریم ورک .NET

کامپایلرهای C Sharp دیگری هم وجود دارند که اغلب شامل یک پیاده سازی از زیرساخت زبان مشترک و کتابخانه های کلاس .NET تا .NET 2.0 هستند.

  • پروژه Mono یک کامپایلر C Sharp کد باز را فراهم می کند که یک پیاده سازی کاملا کد باز از زیرساخت زبان مشترک است و شامل کتابخانه های فریم ورک مورد نیاز به صورتی که در مشخصات ECMA آمده است و همچنین یک پیاده سازی تقریبا کامل شده از کتابخانه های کلاس .NET اختصاصی مایکروسافت تا .NET 3.5 هستند. برای Mono 2.6 هنوز هیچ طرحی برای به کارگیری WPF وجود ندارد. WF برای انتشار بعدی برنامه ریزی شده است و تنها پیاده سازی های جزئی از LINQ to SQL و WCF وجود دارد.
  • پروژه DotGNU (اکنون متوقف شده است) نیز یک کامپایلر کد باز C# فراهم کرده بود که تقریبا یک پیاده سازی کامل از زیرساخت زبان مشترک و شامل کتابخانه های فریم ورک مورد نیاز به صورتی که در مشخصات ECMA آمده اند و زیرمجموعه ای از برخی از باقی مانده کتابخانه های کلاس .NET اختصاصی مایکروسافت تا .NET 2.0 بود (آنهایی که مستند نشده و در مشخصات ECMA شامل نشده اند، اما در توزیع فریم .NET استاندارد مایکروسافت شامل شده اند).
  • پروژه Rotor مایکروسافت (در حال حاضر “زیرساخت به اشتراک گذاشته شده منبع زبان مشترک” نامیده می شود) (دارای مجوز تنها برای مصارف آموزشی و تحقیقاتی است) یک پیاده سازی با منبع مشترک از CLR runtime و یک کامپایلر C Sharp و زیرمجموعه ای از کتابخانه های فریم ورک زیرساخت زبان مشترک در مشخصات ECMA را فراهم می کند (تا C# 2.0 و تنها روی ویندوز XP پشتیبانی می شود).

منابع: ویکی پدیا انگلیسی ، وبسایت Microsoft ، آریا گستر و

توصیه می کنیم دوره های جامع فارسی مرتبط با این موضوع آریاگستر را مشاهده کنید:
صفر تا صد آموزش برنامه نویسی در یونیتی با سی شارپ – پک 1
صفر تا صد آموزش برنامه نویسی در یونیتی با سی شارپ – پک ۲
صفر تا صد آموزش یونیتی دو بعدی – پک 1
صفر تا صد آموزش یونیتی دو بعدی – پک 2
صفر تا صد آموزش یونیتی سه بعدی پک 1
صفر تا صد آموزش یونیتی سه بعدی پک 2
صفر تا صد آموزش زامارین
محصولات آموزشی مرتبط با برنامه نویسی

توجه : مطالب و مقالات وبسایت آریاگستر تماما توسط تیم تالیف و ترجمه سایت و با زحمت فراوان فراهم شده است . لذا تنها با ذکر منبع آریا گستر و لینک به همین صفحه انتشار این مطالب بلامانع است !

 

دوره های آموزشی مرتبط

مطالب مرتبط

قوانین ارسال دیدگاه در سایت

  • چنانچه دیدگاهی توهین آمیز یا بی ارتباط با موضوع آموزش باشد تایید نخواهد شد.
  • چنانچه دیدگاه شما جنبه ی تبلیغاتی داشته باشد تایید نخواهد شد.

  1. aminimohamadfazel گفته؛

    سلام خوبه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

لینک کوتاه: