از ویکیپدیا، دانشنامهٔ آزاد
سی شارپ
(به انگلیسی: C#)، زبانی شیءگرا و سطح بالا از خانوادهٔ زبانهای چارچوب داتنت شرکت مایکروسافت است.
زبان سی شارپ، یک زبان برنامهنویسی چند الگویی و منظم شده مدلهای تابعی، امری، عمومی، شیءگرا و جز گرا و در بستر دات نت میباشد. این زبان توسط مایکروسافت و جزئی از دات نت به وجود آمد و بعداً استانداردهای ECMA و ISO را نیز در بر گرفت. سی شارپ یکی از ۴۴ زبان برنامهنویسی است که توسط زمان اجرای زبان مشترک از چارچوب داتنت پشتیبانی میشوند و در همه جا به وسیله مایکروسافت ویژوال استودیو شناخته میشود.
زبان سی شارپ با قدرت و در عین حال سطح بالایی خود توانسته توجه بسیاری از برنامه نویسان را به خود جلب کند.
این زبان برپایه سادگی، مدرن بودن، همه منظوره و شیءگرا بودن ساخته شد. آندرس هجلزبرگ، طراح زبان برنامهنویسی دلفی، سرپرستی تیم طراحان زبان سی شارپ را بر عهده داشت. این زبان دارای دستوری شیءگرا مشابه ++C است و به شدت از زبانهای جاوا و دلفینیازمندمدرک تأثیر پذیرفتهاست. در ابتدا نام این زبان COOL بود که مخفف C like Object Oriented Language بود، هر چند در ژوئیه ۲۰۰۰، زمانی که مایکروسافت پروژه را عمومی اعلام کرد، اسم آن به سی شارپ تغییر پیدا کرد. آخرین نسخه آن نسخه ۵٫۰ است که همزمان با داتنت ۴٫۵ در اوت ۲۰۱۲ منتشر شد.
اهداف طراحی زبان
- استاندارد ECMA این اهداف طراحی زبان را برای سی شارپ بر آورده میسازد:
- سی شارپ یک زبان برنامهسازی ساده، مدرن، برای اهداف عمومی و شیءگرا است.
- به دلیل اهمیت داشتن موضوع نیرومندی و دوام و بهرهوری برنامهنویس، زبان دارای چککننده Strong Type، چککننده مرزهای آرایه، تشخیص حالتهایی که یک متغیر مقداردهی اولیه نشدهاست، قابلیت انتقال کدها و Garbage Collection خودکار است.
- این زبان برای استفاده در اجزای توسعه نرمافزار برای دستیابی به مزایای سامانههای توزیعی در نظر گرفته شدهاست.
- قابلیت انتقال برنامهنویس بسیار مهم است، خصوصاً برای آن دسته از برنامهنویسانی که با زبانهای C و C++ آشنا هستند.
- پشتیبانی از این زبان برای بینالمللی شدن بسیار مهم است.
- زبان سی شارپ برای نوشتن برنامهها برای سامانههای تعبیه شده و میزبان در نظر گرفته شدهاست، سیستمعاملهای پیچیده بسیار بزرگ گرفته تا توابع اختصاصی بسیار کوچک.
- هر چند برنامههای نوشته شده با سی شارپ طوری هستند که از لحاظ حافظه و پردازنده مورد نیاز مقرون به صرفه باشند، ولی خود زبان از لحاظ اندازه و کارایی به خوبی زبانهای C و اسمبلی نیست.
تاریخچه
در سال ۱۹۹۹، شرکت سان اجازه استفاده از زبان برنامهنویسی جاوا را در اختیار ماکروسافت قرار داد تا در سیستمعامل خود از آن استفاده کند. جاوا در اصل به هیچ پلت فرم یا سیستمعاملی وابسته نبود، ولی ماکروسافت برخی از مفاد قرار داد را زیر پا گذاشت و قابلیت مستقل از سیستمعامل بودن جاوا را از آن برداشت. شرکت سان پروندهای علیه ماکروسافت درست کرد و ماکروسافت مجبور شد تا زبان شیءگرای جدیدی با کامپایل جدید که به ++C شبیه بود را درست کند. در طول ساخت دات نت، کلاسهای کتابخانهای با زبان و کامپایلر SMC نوشته شدند. در سال ۱۹۹۹ آندرس هلزبرگ گروهی را برای طراحی زبانی جدید تشکیل داد که در آن زمان نامش Cool بود و همانند C بود با خواص شیءگرایی. ماکروسافت در نظر داشت اسم این زبان را تا آخر Cool قرار دهد، ولی به دلیل مناسب نبودن برای اهداف تجاری این کار را نکرد. در ارائه و معرفی رسمی چارچوب داتنت درPDC در سال ۲۰۰۰ این زبان به سی شارپ تغییر نام یافت و کتابخانه کلاسها و runtime در ایاسپیداتنت به سی شارپ منتقل شدند. مدیر و سرپرست طراحان در ماکروسافت آندرس هلزبرگ بود که تجربه قبلی او در طراحی Framework و زبانهای برنامه سازی++Borland، دلفی (شهر)،Turbo Pascal، ویژوال سی++ به آسانی در دستورالعملهای سی شارپ قابل رویت است و به همان خوبی در هسته CLR.
ویژگیها
برخی از تفاوتهای زبان سی شارپ با C و ++C عبارتند از:
- هیچ تابع یا متغیر سراسری(Global) وجود ندارد، تمام متدها و اعضا بایستی در داخل کلاسها تعریف شوند. این امر ممکن است، هر چند برای استفاده از متغیرها و توابع عمومی باید از متدها و متغیرها در کلاسهای عمومی استفاده کرد.
- متغیرهای عمومی، بر خلاف C و ++C، نمیتوانند بلاکهای پیوستی را در بر بگیرند.
- سی شارپ دارای یک نوع داده بولی است (bool). برخی از عبارتها مانند while و if که شرطی هستند، نیازمند یک عبارت نوع بولی هستند. همانطور که ++C نیز دارای نوع داده بولی است، این نوع داده به راحتی میتواند به یا از Integerها تبدیل شود، و عبارتی مانند (if(a نیازمند این امر است که a از یک نوع قابل تبدیل به bool یا اشاره گر باشد. کامپایلر سی شارپ برنامه نویس را در این شرایط مجبور به استفاده از عباراتی میکند که به درستی یک مقدار bool را برمیگردانند؛ بنابراین دستوری مانند (if(a = b باعث بروز خطا میشوند. (به جای = بایستی از == استفاده شود)
- در سی شارپ، اشاره گرهای به حافظه بایستی فقط در داخل بلوکهای unsafe استفاده شوند و برنامه در این حالت برای اجرا نیاز به اجازه از کاربر دارد. بیشتر دسترسی شی از طریق شی امن است که یا همیشه در حال اشاره به شی صحیح موجود است یا یک مقدار Null دارد. اشاره گری به شی به درد نخور یا بلاک حافظه رندم غیرممکن است. اشاره گر نا امن میتواند به نمونهای از value-type، آرایه، رشته یا بلاکی که حافظه به آن داده شدهاست اشاره نماید. کدی که به عنوان نا امن علامت نخورده باشد، هنوز میتواند اشاره گرها را از سامانه بازیابی یا در آن ذخیره کند ولی نمیتواند مرجع جدیدی به آنها اختصاص دهد.
- حافظه ساماندهی شده نمیتواند صریحاً آزاد شود، ولی به طور خودکار به عنوان به درد نخور تلقی میشود. انتخاب آدرسهای به درد نخور حافظه نفوذ ناپذیر است. هم چنین سی شارپ با استفاده از عبارات، پشتیبانی مستقیمی از پایان اجباری میکند (پشتیبانی از اصطلاح Resource Acquisition Is Initialization).
- وراثت چندگانه از کلاسها در این زبان پشتیبانی نمیشود. البته یک کلاس امکان ارث بری از تعداد نامحدود واسطها را دارد. پشتیبانی نکردن از وراثت چندگانه به دلیل اهداف معماری این زبان در CLI و برای جلوگیری از پیچیدگی است. در عوض میتوان از اینترفیسهای مختلف استفاده کرد. یعنی برای یک کلاس که احتمالاً فرزند کلاسی دیگر است (ارث برده) میتوان چندین اینترفیس را پیادهسازی (Implement) نمود.
- سی شارپ بسیار typesafe تر از C++ است. تنها تبدیلات ضمنی مثل تبدیل نوع داده کوچکتر به بزرگتر یا تبدیل نوع مشتق شده به نوع پایه به طور پیش فرض و بدون خطا صورت میپذیرد. هیچ تبدیل ضمنی ای میانBooleanها و Integerها وجود ندارد و هر تبدیل user-defined بایستی به صراحت با یکی از کلمات explicit یا implicit نشانه گذاری شود. تبدیل b به a در حالتی که a یک Integer و b یک double باشد در زبان C++ مجاز است اما در سی شارپ به یک خطای زمان کامپایل منجر میشود (بایستی به صورت explicit تعریف شود)
- اعضای Enumeration در داخل محدوده شخصی خود قرار دارند.
- سی شارپ قابلیت syntactic sugar را برای توابع متداول، اکسسورها و ماجولهای کسول شده در یک کلاس به صورت ویژگیها قرار دادهاست.
اکسسورها که خاصیت نیز گفته میشوند در زبان سی شارپ قادر به کنترل دسترسی اعضا و معتبرسازی دادهها هستند.
- تمام انواع بازتابی(Reflection) و بازیابی(Recovery) قابل استفادهاست.
- در حال حاضر (۳ ژوئن ۲۰۰۸) دارای ۷۷ کلمه رزرو شدهاست.
ساختمان داده (ساختار و ذخیر سازی داده)
این کمپایلر در مقابل C یا ++C دارای ساختار بسیار متفاوتی است که دانستن آن به برنامه نویس امکان نوشتن برنامههای بسیار بهینه را خواهد داد.
رشتههادر C و یا ++C ساختار رشته به صورت ارایهای از نوع char بود که امکان اضافه کردن به رشته را محدود میکرد به دلیل ثابت بودن طول در آغاز تعریف ولی در سی شارپ دو نوع متفاوت رشته وجود دارد؛ که یکی به صورت ارایهای با طول ثابت ۲۵۶(در عمل ۲۵۵)موجوداست (به صورت پیش فرض) و در صورتی که با کمبود جا روبرو شود فضای جدید (بزرگتر) یافته و به ان انتقال میدهد؛ ولی در نوع دوم رشتهها از لیست پیوندی اسفاده میشود.
سامانه یکپارچه شده
سی شارپ دارای یک سامانه نوع یکپارچهاست که به آن CTS میگویند. این بدان معناست که تمام انواع، شامل موارد اصلی مانند Integerها، مشتق شده از System.Object هستند. به عنوان مثال، هر نوع یک متد به نام ToString() را به ارث میبرد. بخاطر کارائی، انواع اولیه (و انواع مقداری) به طور داخلی فضایی برای آنها بر روی پشته در نظر گرفته میشود.
انواع داده
CTS دادهها را به دو نوع تقسیم میکند:
- نوع مقداری (Value Type)
- نوع مرجعی (Refrence Type)
انواع دادهای توده سادهای از داده میباشند. نمونههای انواع دادهای نه هویت مرجعی دارند و نه مفاهیم مقایسه مراجع را. برای مقایسه برابری یا عدم برابری انواع دادهای، خود مقدار دادهها را با یکدیگر مقایسه میکنیم مگر اینکه عملگرهای مشابه دوباره تعریف شده باشند. مقادیر دادههای مرجعی همیشه یک مقدار پیش فرض دارند و همیشه میتوانند ایجاد و یا کپی شوند. یکی دیگر از محدودیتهای انواع دادهای این ات که آنها نمیتوانند از یکدیگر مشتق شوند (ولی میتوانند اشتراکاتی داشته باشند) و هم چنین نمیتوانند در سازنده مقدار دهی اولیه شوند. مثالی از انواع دادهای، بعضی از انواع اولیه مانند int و float و char و System.DateTime میباشند. در مقابل، انواع مرجعی مفهوم تعریف مرجعی را دارند (که در آن هر نمونه از نوع مرجع، به طور ذاتی از دیگر نمونهها جدا میشود، حتی اگر داده هر دو نمونه یکی باشد). این دقیقاً نمونه مشابه مقایسه تساوی یا عدم تساوی دادههای مرجعی است، که در آن آزمایش برای مرجعها از دادهایها سریع تر است. در کل نه همیشه امکان تعریف نمونه مرجعی وجود دارد و نه امکان کپی یا نمایش مقادیر مقایسه دو نمونه؛ ولی به هر حال انواع مرجعی خاص میتوانند این اعمال را از طریق سازندههای عمومی یا اجرای واسطهای مشابه (مثل ICloneable یا IComparable) انجام دهند. نمونههایی از انواع مرجعی، اشیاء، System.String و Sysmet.Array میباشند. هر دو نوع داده قابلیت انعطاف توسط تعریف به وسیله کاربر را دارند. در واقع وقتی ما نوع دادهای را به تابع ای ارسال میکنیم، آدرس داده نیز فرستاده میشود. البته این امر پیش فرض است ولی برای دادههای مثل آرایه، رشتهای، آدرس فرستاده میشود و ارسال از نوع مرجع میشود