سی شارپ (به انگلیسی: C#)، زبانی شیءگرا و سطح بالا از خانوادهٔ زبانهای چارچوب داتنت شرکت مایکروسافت است.
زبان سی شارپ، یک زبان برنامهنویسی چند الگویی و منظم شده مدلهای تابعی، امری، عمومی، شیءگرا و جز گرا و در بستر دات نت میباشد. این زبان توسط مایکروسافت و جزئی از دات نت به وجود آمد و بعداً استانداردهای ECMA و ISO را نیز دربر گرفت. سی شارپ یکی از ۴۴ زبان برنامهنویسی است که توسط زمان اجرای زبان مشترک از چارچوب داتنت پشتیبانی میشوند و در همه جا به وسیله مایکروسافت ویژوال استودیو شناخته میشود.
زبان سی شارپ با قدرت و در عین حال سطح بالایی خود توانسته توجه بسیاری از برنامه نویسان را به خود جلب کند.
این زبان برپایه سادگی، مدرن بودن، همه منظوره و شیءگرا بودن ساخته شد. آندرس هجلزبرگ، طراح زبان برنامهنویسی دلفی، سرپرستی تیم طراحان زبان سی شارپ را بر عهده داشت. این زبان دارای دستوری شیءگرا مشابه ++C است و به شدت از زبانهای جاوا و دلفینیازمندمدرک تأثیر پذیرفتهاست. در ابتدا نام این زبان COOL بود که مخفف C like Object Oriented Language بود، هر چند در ژوئیه ۲۰۰۰، زمانی که مایکروسافت پروژه را عمومی اعلام کرد، اسم آن به سی شارپ تغییر پیدا کرد.
اهداف طراحی زبان
اسم سی شارپ از علامت موسیقی شارپ گرفته شدهاست که در موسیقی بیان گر این است که متن نوشته شده باید نیم قدم از خط بالاتر باشد. مطابق با ECMA-۳۳۴، بخش ۶، مخففها و اختصارها، نام زبان به صورت «#C» نوشته میشود(«کلمه لاتین C (U+۰۰۴۳) به همراه علامت عددی #(U+۰۰۲۳)») که به صورت «سی شارپ» تلفظ میشود. علامت «#» نباید با علامت شارپ در موسیقی(♯، U+266F) که در یک صفحه کلید استاندارد وجود ندارد اشتباه گرفته شود. پسوند شارپ، توسط بسیاری دیگر از زبانهای دات نت مانند #J، #A و #F نیز به کار رفتهاست. پیادهسازی اولیه از زبان ایفل تحت دات نت نیز #Eiffel نام داشت که الان زبان ایفل را بهطور کامل پشتیبانی میکند. هم چنین این پسوند بعضی وقتها در کتابخانهها نیز به کار میرود، مانند #Gtk، #Cocoa و #Qt.
تاریخچه
در سال ۱۹۹۹، شرکت سان اجازه استفاده از زبان برنامهنویسی جاوا را در اختیار مایکروسافت قرار داد تا در سیستمعامل خود از آن استفاده کند. جاوا در اصل به هیچ پلت فرم یا سیستمعاملی وابسته نبود، ولی مایکروسافت برخی از مفاد قرار داد را زیر پا گذاشت و قابلیت مستقل از سیستمعامل بودن جاوا را از آن برداشت. شرکت سان پروندهای علیه مایکروسافت درست کرد و مایکروسافت مجبور شد تا زبان شیءگرای جدیدی با کامپایل جدید که به ++C شبیه بود را درست کند. در طول ساخت دات نت، کلاسهای کتابخانهای با زبان و کامپایلر SMC نوشته شدند. در سال ۱۹۹۹ آندرس هلزبرگ گروهی را برای طراحی زبانی جدید تشکیل داد که در آن زمان نامش Cool بود و همانند C بود با خواص شیءگرایی. مایکروسافت در نظر داشت اسم این زبان را تا آخر Cool قرار دهد، ولی به دلیل مناسب نبودن برای اهداف تجاری این کار را نکرد. در ارائه و معرفی رسمی چارچوب داتنت در PDC در سال ۲۰۰۰ این زبان به سی شارپ تغییر نام یافت و کتابخانه کلاسها و runtime در ایاسپیداتنت به سی شارپ منتقل شدند. مدیر و سرپرست طراحان در مایکروسافت آندرس هلزبرگ بود که تجربه قبلی او در طراحی Framework و زبانهای برنامه سازی++Borland، دلفی (شهر)، Turbo Pascal، ویژوال سی++ به آسانی در دستورالعملهای سی شارپ قابل رویت است و به همان خوبی در هسته CLR.
برخی از تفاوتهای زبان سی شارپ با C و ++C عبارتند از:
اکسسورها که خاصیت نیز گفته میشوند در زبان سی شارپ قادر به کنترل دسترسی اعضا و معتبرسازی دادهها هستند.
CTS دادهها را به دو نوع تقسیم میکند:
انواع دادهای توده سادهای از داده میباشند. نمونههای انواع دادهای نه هویت مرجعی دارند و نه مفاهیم مقایسه مراجع را. برای مقایسه برابری یا عدم برابری انواع دادهای، خود مقدار دادهها را با یکدیگر مقایسه میکنیم مگر اینکه عملگرهای مشابه دوباره تعریف شده باشند. مقادیر دادههای مرجعی همیشه یک مقدار پیش فرض دارند و همیشه میتوانند ایجاد یا کپی شوند. یکی دیگر از محدودیتهای انواع دادهای این ات که آنها نمیتوانند از یکدیگر مشتق شوند (ولی میتوانند اشتراکاتی داشته باشند) و هم چنین نمیتوانند در سازنده مقدار دهی اولیه شوند. مثالی از انواع دادهای، بعضی از انواع اولیه مانند int و float و char و System.DateTime میباشند. در مقابل، انواع مرجعی مفهوم تعریف مرجعی را دارند (که در آن هر نمونه از نوع مرجع، بهطور ذاتی از دیگر نمونهها جدا میشود، حتی اگر داده هر دو نمونه یکی باشد). این دقیقاً نمونه مشابه مقایسه تساوی یا عدم تساوی دادههای مرجعی است، که در آن آزمایش برای مرجعها از دادهایها سریع تر است. در کل نه همیشه امکان تعریف نمونه مرجعی وجود دارد و نه امکان کپی یا نمایش مقادیر مقایسه دو نمونه؛ ولی به هر حال انواع مرجعی خاص میتوانند این اعمال را از طریق سازندههای عمومی یا اجرای واسطهای مشابه (مثل ICloneable یا IComparable) انجام دهند. نمونههایی از انواع مرجعی، اشیاء، System.String و Sysmet.Array میباشند. هر دو نوع داده قابلیت انعطاف توسط تعریف به وسیله کاربر را دارند. در واقع وقتی ما نوع دادهای را به تابع ای ارسال میکنیم، آدرس داده نیز فرستاده میشود. البته این امر پیش فرض است ولی برای دادههای مثل آرایه، رشتهای، آدرس فرستاده میشود و ارسال از نوع مرجع میشود.
کلاسهای Partial اجازه اجرای کلاسها از بیش از یک سورس فایل را میدهند. این امر اجازه میدهد تا کلاسهای بسیار بزرگ را قطعه قطعه کنیم و همچنین برای زمانی که برخی قسمتهای یک کلاس بهطور خودکار تولید میشوند مفید است.
genericها یا نوعهای پارامتری شده یا چندریختیهای پارامتری یک ویژگی جدید چارچوب داتنت ۲٫۰ است که به وسیله سی شارپ پشتیبانی میشود. برخلاف Templateهای سی پلاس پلاس، در این انواع به جای اینکه نمونه سازی توسط کامپایلر انجام شود، در زمان اجرا صورت میگیرد، بنابراین میتوانند چند زبانه باشند در حالی که ++C نمیتواند. آنها دارای ویژگیهایی هستند که بهطور مستقیم توسطTemplateهای C++ پشتیبانی نمیشوند مانند نوع محدودیتها در پارامترهای Generic با استفاده از رابطها(Interface). سی شارپ از پارامترهایهای Generic بدون نوع پشتیبانی نمیکند. بر خلاف genericهای جاوا،genericهای دات نت برای پارامتری کردن انواع دادهای در اشیاء ماشین مجازی CLI، از مفاهیم شیءگرایی استفاده میکنند که اجازه بهینهسازی و حفاظت انواع اطلاعات را میدهد.
کلاسها به صورت Static قابل تعریف نیستند مگر اینکه تمام اعضای آنها Static باشند؛ که این امر بسیار شبیه به مفهوم مدل در زبانهای رویهای است. (زبان رویهای: یک زبان برنامهنویسی که در آن عنصر اصلی برنامهنویسی یک زیربرنامهاست. مانند زبانهای C، پاسکال و…)
Delegate یک شی میباشد که حاوی یک یا چند اشاره گر به توابع میباشد؛ که با Invoke کردن آن تمامی توابع اشاره شده داخل آن اجرا میشوند.
های ناشناس که عملکردهای محدودی را در سی شارپ به وجود میآورند. کد کنار بدنه Deletage ناشناس، دسترسی کامل برای خواندن یا نوشتن در متغیرهای عمومی، پارامترهای توابع و اعضای کلاسهای دارای محدوده Deletage را دارد ولی پارامترهای out و ref را پشتیبانی نمیکند.
نوع داده Nullable (که با یک علامت سؤال قابل تشخیص است: int? i = null;)اجازه تخصیص مقدار null را برای انواع دادهای میدهد. این امر باعث بهبودی فعل و انفعال با پایگاه داده SQL میشود. در این حالت نوع ستونی INTEGER NULL در SQL بهطور مستقیم به int? در سی شارپ تبدیل میشود.
دادههای Nullable در آخرین لحظات اوت ۲۰۰۵ اضافه شدند چند هفته مانده به اتمام کار اداری و برای بهبود زبان. متغیر Null در حقیقت خالی نیست، بلکه نمونهای است از struct Nullable<T> با ویژگی HasValue مساوی false. وقتی در برنامه قرار میگیرد، خود به خود نمونه خالی در آن قرار میگیرد، نه مقدار خود آن، در نتیجه اشاره گر مقصد همیشه غیر Null میباشد.
مقدار اولین عملوندی که null نباشد را برمیگرداند. (یا null، برای زمانی که تمام عملوندها null باشند)
کاربرد اصلی این عملگر در قرار دادن یک مقدار nullable در یک مقدار non-nullable با استفاده از یک دستورالعمل سادهاست.
این ورژن در تاریخ ۱۹ نوامبر سال ۲۰۰۷ به عنوان بخشی از چارچوب داتنت ۳٫۵ عرضه شد؛ که شامل ویژگیهای جدید الهام شده از زبانهای برنامهنویسی اصلی (Functional) مانند Haskell و ML، و الگوی LINQ برای CLR است. در حال حاضر توسط هیچ موسسه استانداردسازی تأیید نشدهاست.
لینک (به انگلیسی: Language Integrated Query)(مخفف انگلیسی: LINQ) یک زبان پرس و جوی قابل انعطاف و همه منظوره برای بسیاری از انواع منبع دادهها است (مثل انتخاب اشیاء شناور، سندهای XML، بانکهای اطلاعاتی و…) که در ویژگیهای سی شارپ ۳ جمع شدهاند. سینتکس زبان به زحمت از SQL گرفته شدهاست.
سی شارپ ۲٫۰ توابع بینام را معرفی کرد. سی شارپ ۳٫۰ هم انواع بینام را معرفی میکند. با استفاده از این ویژگی برنامه نویسان قادر خواهند بود به صورت Inline انواع دلخواه خود را ایجاد کنند.
عبارات لامبدا یک راه کوتاه برای نوشتن مقادیر توابع بینام کلاس اول را فراهم میکنند.
کامپایلر بهطور خودکار یک متغیر نمونه خصوصی و قرار دهنده و قرار گیرنده مناسب تولید میکند.
توابع بسط داده شده حالتی از سینتکس Suger هستند که امکان اضافه کردن متد جدید به کلاس موجود را بیرون از حوزه تعریف آن فراهم میکنند.
توابع جزئی به تولیدکنندههای کد اجازه تولید اعلان توابع به صورت نقاط گسترش یافتهای که تنها شامل کدهای اصلی هستند را میدهد، در صورتی که یک نفر آن را در قسمتی از کلاسی دیگر اجرا کند.
سی شارپ ۳٫۰ کلمه کلیدی جدید var را معرفی میکند که به کمک آن برنامه نویسان قادر خواهند بود متغیرهای محلی خود را بدون ذکر صریح نوع آنها، تعریف کنند.
تیم طراح سی شارپ ویژگی فوقالعادهای را به آن اضافه کرد که برنامه نویسان را قادر میسازد نحو (Syntax) زبانهای پرس و جو مانند SQL و XQuery را با استفاده از این زبان پیادهسازی کنند. این ویژگی با نام اختصاری LINQ شناخته میشود و دارای انواع زیر است:
آرایهها را نیز میتوان با استفاده از کلمه کلیدی var تعریف کرد.
توضیحات تک خطی با ساتفاده از دو اسلش // تعریف می شوند و توضیحات چند خطی با /* شروع و به */ ختم میشوند.
ویژگی «دستورها پیش پردازنده» سی شارپ (اگرچه آنها به واقع یک پیش پردازنده نیستند) مبنی بر دستورها پیش پردازنده C است که به برنامهنویس اجازه تعریف سمبلهایی را میدهند. برخی از این دستورها عبارتند از: #if، #region، #define. راهنماهایی نظیر #region تذکراتی به ویرایشگرها برای code folding میدهند.
سامانه مستندسازی سی شارپ بسیار شبیه به جاوا است، اما مبنی بر XML. دو شیوه مستندسازی در حال حاضر به وسیله کامپایلر سی شارپ پشتیبانی میشود.
توضیحات تک خطی، که معمولاً در تولیدکننده کد Visual Studioپیدا میشوند، با استفاده از/// شروع میشوند.
نسخه بعدی این زبان، سی شارپ ۴ است که از اکتبر سال ۲۰۰۸ در حال ساخته شدن است. مایکروسافت لیستی از ویژگیهای جدید سی شارپ ۴ را در کنفرانس توسعه دهندگان حرفهای اعلام کردهاست. تمرکز اصلی در ورژن بعدی روی قابلیت هماهنگی فریم ورکها و نوع زبانهایی است که کامال پویا یا قیمتی پویا هستند، مانند dynamic language runtime و COM. ویژگیهای زیر تا کنون اعلام شدهاند:
در آگوست سال ۲۰۰۰، شرکت مایکروسافت، و Hewlett-Packard و شرکت اینتل به عنوان پشتیبان مشخصات سی شارپ را مانند CLI به سازمان استانداردسازی ECMA ارائه کردند. در دسامبر سال ۲۰۰۱، این سازمان، ECMA-۳۳۴ را با عنوان مشخصات زبان سی شارپ منتشر کرد. سی شارپ در سال ۲۰۰۳ به عنوان یک استاندارد ISO به ثبت رسید(ISO/IEC ۲۳۲۷۰). در سال ۲۰۰۲، ECMA دومین ویرایش از خصوصیات زبان سی شارپ را پذیرفت.
در ژوئن سال ۲۰۰۵، ECMA سومین ویرایش را با اضافه کردن مواردی همچون کلاسهای partial، متدهای ناشناس، انواع nullable و Genericها منتشر کرد. در ژوئیه ۲۰۰۵، ECMA استانداردها و TRها را همراه با پردازش Fast-Track اخیر به ISO/IEC JTC پیشنهاد کرد. این روند معمولاً ۶ تا ۹ ماه زمان میبرد. آخرین ویرایش این زبان در ۱۵ آگوست سال ۲۰۱۲ در قالب Framework ۴٫۵ارائه گردید.
با توجه به توابع موجود در چارچوب داتنت امکان استفاده از این توابع وجود دارد که میتوان گفت برای هر کاری شرکت مایکروسافت تابعی پیشبینی کرده؛ که این امکان را ایجاد میکند که به فایل اصلی پروژه هیچ فایل کتابخانی را اضافه نکنید (هم به صورت دستی یا خود کامپایلر). این موضوع خود باعث ایجاد فایلهای خروجی با حجم بسیار کم میشود. این موضوع در بسیاری از موارد بسیار اهمیت دارد. برنامههای سی شارپ، همچون تمام برنامههای نوشته شده در چارچوب داتنت و سایر محیطهای ماشینی مجازی مانند جاوا، نیازمند منابع سامانه و حافظه بیشتری نسبت به برنامههای نوشته شده با سایر زبانها مانند سی پلاس پلاس است و هم چنین سرعت کمتری نیز دارد. هر چند تعریف زبان سی شارپ و CLI تحت استانداردهای ISO و ECMA استاندارد شدهاند،CLI تنها قسمتی از Base Class Library (BCL) مایکروسافت میباشد که شامل کلاسهای غیر استاندارد استفاده شده در برنامههای سی شارپ نیز میشود. از این گذشته، بعضی از قسمتهای BCL تحت حق امتیاز مایکروسافت هستند که ممکن است پیادهسازی کامل framework را مختل کند، زیرا تنها بخشهای استاندارد دارای حق محافظت RAND در برابر مدعیان را دارند.
کاملاً شبیه به پروژه Mono.
بنا به درخواست های مکرر در مورد آموزش برنامه نویسی زبان سی شارپ بخصوص دوره مقدماتی مختص به دوستان مبتدی مفتخریم تا این دوره جدید رو تقدیم شما عزیزان کنیم.
دوره های قبلی تمرکز بر مباحث پروژه محور داشت لذا توی این دوره سعی شده مباحث ابتدایی و بسیار مهم لحاظ بشه تا برای دوستان کمی حرفه ای تر خسته کننده و تکراری نباشه و در عین حال یک آموزش جامع و کاربردی از زبان برنامه نویسی سی شارپ باشد.
محتویات تدریس شده فعلی در این مجموعه:
- معرفی انواع مقدار ها
- تعریف فضای نام کلاس و Assembly
- معرفی محیط کد نویسی در Visual Studio
- معرفی دستورات اولیه پیشفرض و کاربرد آنها
- کار با رشته ها Strings
- کار با اعداد و اعمال روی آنهاNumbers
- کار با آرایه ها
- کار با متود ها
- کار با دستورات شرطی IF
- کار با دیاگرامSwitch
- شرط های پی در پیIF Else
- انواع حلقه ها for-do-while
منابع: