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

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

قابلیت حمل در زبان برنامه نویسی سی شارپ

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

وابستگی به نوع در زبان برنامه نویسی #C

زبان برنامه نویسی سی شارپ از اعلان های متغیرهای ضمنی وابسته زیاد به نوع با کلمه کلیدی 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 که هر دو به طور پیش فرض ضمنی هستند.

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

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

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

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

برنامه نویسی متا در سی شارپ - C Sharp

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

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

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

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

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

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

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

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

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

Namespace در #C

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

دسترسی به حافظه در زبان برنامه نویسی سی شارپ

در زبان برنامه نویسی #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، گسترش داد.

 

در این مقاله از آموزشگاها با ویژگی های بارز زبان برنامه نویسی سی شارپ آشنا شدیم و هر یک قابلیت های سی شارپ را برای شما به تفصیل شرح دادیم. در مقاله بعدی با آموزشگاها همراه باشید تا انواع داده ها، کتابخانه ها و مثال های کاربردی در زبان بان برنامه نویسی سی شارپ را یاد بگیرید.