برنامه نویسی -
24 شهریور 1401
تاریخچه سی شارپ
در سال ۱۹۹۹، شرکت Sun اجازه استفاده از زبان برنامهنویسی جاوا را در اختیار شرکت مایکروسافت قرار داد تا در سیستمعامل خود از آن استفاده کند. جاوا در اصل به هیچ پلتفرم یا سیستمعاملی وابسته نبود، ولی مایکروسافت برخی از مفاد قرار داد را زیر پا گذاشت و قابلیت مستقل از سیستمعامل بودن جاوا را از آن برداشت، شرکت سان پروندهای علیه مایکروسافت درست کرد و مایکروسافت مجبور شد تا زبان شی گرای جدیدی با کامپایل جدید که به ++C شبیه بود را ایجاد کند. در سال ۱۹۹۹ آندرس هلزبرگ گروهی را برای طراحی زبانی جدید تشکیل داد که در آن زمان نامش Cool بود و شبیه زبان C بود اما با خواص شیءگرایی، مایکروسافت در نظر داشت اسم این زبان را برای همیشه Cool قرار دهد، ولی به دلیل مناسب نبودن برای اهداف تجاری این کار را نکرد. در ارائه و معرفی رسمی چارچوب دات نت در سال ۲۰۰۰ این زبان به C# تغییر نام یافت. مدیر و سرپرست طراحان سی شارپ در مایکروسافت آندرس هلزبرگ بود که تجربه قبلی او در طراحی Framework و زبانهای برنامه سازی++Borland، Delphi، Pascal، C++ به آسانی در دستورالعملهای سی شارپ قابل رویت است.
زبان برنامه نویسی سی شارپ (زبان برنامه نویسی C# یا C Sharp) یک زبان برنامه نویسی چند شیوه ای است که شامل اصول وابستگی زیاد به نوع (Strong Typing)، دستوری، اعلانی، تابعی، جنریک یا جامع، شی گرا (مبتنی بر کلاس) و مبتنی بر کامپوننت است. زبان برنامه نویسی سی شارپ توسط شرکت مایکروسافت در پروژه .NET توسعه یافت و بعدها توسط استانداردهای Ecma و ISO به عنوان یک زبان برنامه نویسی استاندارد مورد تایید قرار گرفت. سی شارپ یکی از زبان های برنامه نویسی است که برای زیرساخت زبان مشترک طراحی شده است.
زبان برنامه نویسی سی شارپ قدیمی است؟
در زمانهای که همه چیز با یک ساعت پیش از خود متفاوت است، حالا که میدانیم #C در واقع پیش از شروع قرن ۲۱ ساخته شده است، آیا میتوانیم نتیجه بگیریم که #C پیر شده و بهتر است سراغ یک زبان تازه نفستر مثل Swift برویم؟
قطعا خیر، #C تا به امروز بارها به روز شده است. نسخه ۷٫۱ زبان #C به تازگی منتشر شده است. از نظر من #C یک جوان ۳۰ ساله است که به اندازه کافی جوان و به اندازه کافی با تجربه است.
گفتم که #C یک زبان برنامهنویسی شی گرا است. برای اینکه توضیح بدهم دقیقا یک زبان شی گرا چیست، ابتدا باید بدانیم در زبانهای غیر شی گرا چه میگذرد. زبانهای غیر شی گرا از دو موجودیت «داده» و «عملیات» تشکیل میشوند.
شی گرایی به چه معنا است؟
در ابتدای این مقاله، گفتم که #C یک زبان برنامهنویسی شی گرا است. برای اینکه توضیح بدهم دقیقا یک زبان شی گرا چیست، ابتدا باید بدانیم در زبانهای غیر شی گرا چه میگذرد. زبانهای غیر شی گرا از دو موجودیت «داده» و «عملیات» تشکیل میشوند.
یعنی کل یک نرم افزار، مثل نرم اپلیکیشن اندروید، iOS یا هر نرم افزار دیگری که روی کامپیوترهای شخصی اجرا میشوند، از چندین عملیات (Function) که یک یا چند داده (Data) میگیرد ساخته شده که این function تغییرات لازم را روی آن دادهها اعمال میکند و داده جدید را به function قبلی بر میگرداند.
مثلا فرض کنید که ما دو داده نام و نام خانوادگی داریم:
نام: مریم
نام خانوادگی: نظری
عملیات مورد نظر ما ساخت نام کامل فرد است:
عملیات: نام + نامخانوادگی = مریم نظری
این یک نمونه ساده از شیوه کار زبانهای غیر شیگرا بود. حالا فرض کنید بخواهیم همین عملیات را در #C که یک زبان شی گرا است پیاده کنیم. ما دیگر با دو داده مجزا طرف نیستیم. یک شی وجود دارد به نام انسان، انسان دارای یک نام کوچک و یک نام خانوادگی است.
از پیش برای شی انسان مشخص کردهایم – به وسیله یک function – که چطور نام کامل میسازد. مقادیر محمد و اژدری را به شی انسانی که ساختهایم ارسال میکنیم، حالا یک انسان داریم که نام کامل دارد.
ویژگیهای #C
برخی از تفاوتهای زبان سی شارپ با C و ++C عبارتند از:
متغیرهای عمومی، بر خلاف C و ++C، نمیتوانند بلاکهای پیوستی را در بر بگیرند.
سی شارپ دارای یک نوع داده بولی است (bool). برخی از عبارتها مانند while و if که شرطی هستند، نیازمند یک عبارت نوع بولی هستند. همانطور که ++C نیز دارای نوع داده بولی است، این نوع داده به راحتی میتواند به یا از Integerها تبدیل شود، و عبارتی مانند (if(a نیازمند این امر است که a از یک نوع قابل تبدیل به bool یا اشاره گر باشد. کامپایلر سی شارپ برنامهنویس را در این شرایط مجبور به استفاده از عباراتی میکند که به درستی یک مقدار bool را برمیگردانند؛ بنابراین دستوری مانند (if(a = b باعث بروز خطا میشوند. (به جای = بایستی از == استفاده شود)
در سی شارپ، اشاره گرهای به حافظه بایستی فقط در داخل بلوکهای unsafe استفاده شوند و برنامه در این حالت برای اجرا نیاز به اجازه از کاربر دارد. بیشتر دسترسی شی از طریق شی امن است که یا همیشه در حال اشاره به شی صحیح موجود است یا یک مقدار Null دارد. اشاره گری به شی به درد نخور یا بلاک حافظه رندم غیرممکن است. اشاره گر نا امن میتواند به نمونهای از value-type، آرایه، رشته یا بلاکی که حافظه به آن داده شدهاست اشاره نماید. کدی که به عنوان نا امن علامت نخورده باشد، هنوز میتواند اشاره گرها را از سامانه بازیابی یا در آن ذخیره کند ولی نمیتواند مرجع جدیدی به آنها اختصاص دهد.
حافظه ساماندهی شده نمیتواند صریحاً آزاد شود، ولی بهطور خودکار به عنوان به درد نخور تلقی میشود. انتخاب آدرسهای به درد نخور حافظه نفوذ ناپذیر است. هم چنین سی شارپ با استفاده از عبارات، پشتیبانی مستقیمی از پایان اجباری میکند (پشتیبانی از اصطلاح Resource Acquisition Is Initialization).
سی شارپ بسیار typesafe تر از C++ است. تنها تبدیلات ضمنی مثل تبدیل نوع داده کوچکتر به بزرگتر یا تبدیل نوع مشتق شده به نوع پایه بهطور پیش فرض و بدون خطا صورت میپذیرد. هیچ تبدیل ضمنی ای میانBooleanها و Integerها وجود ندارد و هر تبدیل user-defined بایستی به صراحت با یکی از کلمات explicit یا implicit نشانه گذاری شود. تبدیل b به a در حالتی که a یک Integer و b یک double باشد در زبان C++ مجاز است اما در سی شارپ به یک خطای زمان کامپایل منجر میشود (بایستی به صورت explicit تعریف شود)
سی شارپ بستری امن و قدرتمند برای ساخت نرمافزارهای hybrid را محیا میکند.
آموزش سی شارپ بسیار راحت میباشد
اعضای Enumeration در داخل محدوده شخصی خود قرار دارند.
سی شارپ قابلیت syntactic sugar را برای توابع متداول، اکسسورها و ماجولهای کسول شده در یک کلاس به صورت ویژگیها قرار دادهاست.
اکسسورها که خاصیت نیز گفته میشوند در زبان سی شارپ قادر به کنترل دسترسی اعضا و معتبرسازی دادهها هستند.
تمام انواع بازتابی(Reflection) و بازیابی(Recovery) قابل استفادهاست.
رشتهها
در C یا ++C ساختار رشته به صورت ارایهای از نوع char بود که امکان اضافه کردن به رشته را محدود میکرد به دلیل ثابت بودن طول در آغاز تعریف ولی در سی شارپ دو نوع متفاوت رشته وجود دارد؛ که یکی به صورت ارایهای با طول ثابت ۲۵۶(در عمل ۲۵۵)موجوداست (به صورت پیش فرض) و در صورتی که با کمبود جا روبرو شود فضای جدید (بزرگتر) یافته و به ان انتقال میدهد؛ ولی در نوع دوم رشتهها از لیست پیوندی استفاده میشود.
انواع داده
دادهها به دو نوع تقسیم میشوند:
نوع مقداری (Value Type)
نوع ارجاعی (Refrence Type)
انواع دادهای توده سادهای از داده میباشند. نمونههای انواع دادهای نه هویت مرجعی دارند و نه مفاهیم مقایسه مراجع را. برای مقایسه برابری یا عدم برابری انواع دادهای، خود مقدار دادهها را با یکدیگر مقایسه میکنیم مگر اینکه عملگرهای مشابه دوباره تعریف شده باشند. مقادیر دادههای مرجعی همیشه یک مقدار پیش فرض دارند و همیشه میتوانند ایجاد یا کپی شوند. یکی دیگر از محدودیتهای انواع دادهای این ات که آنها نمیتوانند از یکدیگر مشتق شوند (ولی میتوانند اشتراکاتی داشته باشند) و هم چنین نمیتوانند در سازنده مقدار دهی اولیه شوند. مثالی از انواع دادهای، بعضی از انواع اولیه مانند int و float و char و System.DateTime میباشند. در مقابل، انواع مرجعی مفهوم تعریف مرجعی را دارند (که در آن هر نمونه از نوع مرجع، بهطور ذاتی از دیگر نمونهها جدا میشود، حتی اگر داده هر دو نمونه یکی باشد). این دقیقاً نمونه مشابه مقایسه تساوی یا عدم تساوی دادههای مرجعی است، که در آن آزمایش برای مرجعها از دادهایها سریع تر است. در کل نه همیشه امکان تعریف نمونه مرجعی وجود دارد و نه امکان کپی یا نمایش مقادیر مقایسه دو نمونه؛ ولی به هر حال انواع مرجعی خاص میتوانند این اعمال را از طریق سازندههای عمومی یا اجرای واسطهای مشابه (مثل ICloneable یا IComparable) انجام دهند. نمونههایی از انواع مرجعی، اشیاء، System.String و Sysmet.Array میباشند. هر دو نوع داده قابلیت انعطاف توسط تعریف به وسیله کاربر را دارند. در واقع وقتی ما نوع دادهای را به تابع ای ارسال میکنیم، آدرس داده نیز فرستاده میشود. البته این امر پیش فرض است ولی برای دادههای مثل آرایه، رشتهای، آدرس فرستاده میشود و ارسال از نوع مرجع میشود.