C# زبانی
شئ گرا و سطح بالا (high level) از خانوادهٔ زبانهای چارچوب دات نت شرکت
مايکروسافت است.
زبان #C، یک زبان برنامه نویسی چند الگویی است و منظم شده مدلهای تابعی، امری، عمومی،
شئ گرا و جزگرا میباشد. این زبان توسط
مايکروسافت و جزئی از دات نت به وجود آمد و بعداً استانداردهای ECMA و ISO را نیز در بر گرفت. #C یکی از ۴۴ زبان برنامه نویسی ای است که توسط Common Language Runtime از .NET Framework پشتیبانی میشوند و در همه جا به وسیله Microsoft Visual Studio شناخته میشود.
این زبان برپایه سادگی، مدرن بودن، همه منظوره و
شئ گرا بودن ساخته شد.Anders Hejlsberg، طراح
زبان برنامه نویسی دلفی، سرپرستی تیم طراحان زبان #C را بر عهده داشت.این زبان دارای دستوری
شئ گرا مشابه
++C است و به شدت از زبانهای
جاوا و
دلفی تاثیر پذیرفتهاست. در ابتدا نام این زبان COOL بود که مخفف C like Object Oriented Language بود، هر چند در جولای ۲۰۰۰، زمانی که
مايکروسافت پروژه را عمومی اعلام کرد، اسم آن به #C تغییر پیدا کرد.
اهداف طراحي زبان
استاندارد ECMA این اهداف طراحی زبان را برای #C بر آورده میسازد:
- C# يک زبان برنامه سازی ساده، مدرن، برای اهداف عمومی و شئ گرا است.
- به دلیل اهمیت داشتن موضوع نیرومندی و دوام و بهره وری برنامه نویس، زبان دارای چک کننده Strong Type، چک کننده مرزهای آرایه، تشخیص حالتهایی که یک متغیر مقدار دهی اولیه نشدهاست، قابلیت انتقال کدها و Garbage Collection خودکار است.
- این زبان برای استفاده در اجزای توسعه نرمافزار برای دستیابی به مزایای سیستمهای توزیعی در نظر گرفته شدهاست.
- قابلیت انتقال برنامه نویس بسیار مهم است، خصوصاً برای آن دسته از برنامه نویسانی که با زبانهای C و C++ آشنا هستند.
- پشتیبانی از این زبان برای بینالمللی شدن بسیار مهم است.
- زبان C# برای نوشتن برنامهها برای سیستمهای تعبیه شده و میزبان در نظر گرفته شدهاست، از سیستمعاملهای پیچیده بسیار بزرگ گرفته تا توابع اختصاصی بسیار کوچک.
برخی از تفاوتهای زبان سی شارپ با C و
C++ عبارتند از:
- هیچ تابع یا متغیر سراسری(Global) وجود ندارد، تمام متدها و اعضا بایستی در داخل کلاسها تعریف شوند.این امر ممکن است، هر چند برای استفاده از متغیرها و توابع عمومی باید از متدها و متغیرها در کلاسهاي عمومی استفاده کرد.
- متغیرهای عمومی، بر خلاف C و C++، نمیتوانند بلاکهای پیوستی را در بر بگیرند.
- C# دارای یک نوع داده بولی است (bool).برخی از عبارتها مانند while و if که شرطی هستند، نیازمند یک عبارت نوع بولی هستند.همان طور که C++ نیز دارای نوع داده بولی است، این نوع داده به راحتی میتواند به یا از Integerها تبدیل شود، و عبارتی مانند (if(a نیازمند این امر است که a از یک نوع قابل تبدیل به bool یا اشاره گر باشد.کامپایلر سی شارپ برنامه نویس را در این شرایط مجبور به استفاده از عباراتی میکند که به درستی یک مقدار bool را برمیگردانند. بنابراین دستوری مانند (if(a = b باعث بروز خطا میشوند.(به جای = بایستی از == استفاده شود)
- در C# اشاره گرهای به حافظه بایستی فقط در داخل بلوکهای unsafe استفاده شوند و برنامه در این حالت برای اجرا نیاز به اجازه از کاربر دارد. بیشتر دسترسی شی از طریق شی امن است که یا همیشه در حال اشاره به شی صحیح موجود است یا یک مقدار Null دارد. اشاره گری به شی به درد نخور یا بلاک حافظه رندم غیر ممکن است.اشاره گر نا امن میتواند به نمونهای از value-type، آرایه، رشته یا بلاکی که حافظه به آن داده شدهاست اشاره نماید. کدی که به عنوان نا امن علامت نخورده باشد، هنوز میتواند اشاره گرها را از سیستم بازیابی یا در آن ذخیره کند ولی نمیتواند مرجع جدیدی به آنها اختصاص دهد.
- حافظه ساماندهی شده نمیتواند صریحا آزاد شود، ولی به طور خودکار به عنوان به درد نخور تلقی میشود.انتخاب آدرسهای به درد نخور حافظه نفوذ ناپذیر است. هم چنین #C با استفاده از عبارات، پشتیبانی مستقیمی از پایان اجباری میکند (پشتیبانی از اصطلاح Resource Acquisition Is Initialization).
- وراثت چندگانه از کلاسها در این زبان پشتیبانی نمیشود.البته یک کلاس امکان ارث بری از تعداد نامحدود واسطها را دارد.پشتیبانی نکردن از وراثت چندگانه به دلیل اهداف معماري این زبان در CLI و برای جلوگیری از پيچيدگياست. در عوض میتوان از اینترفیسهای مختلف استفاده کرد. یعنی برای یک کلاس که احتمالا فرزند کلاسي دیگر است (ارث برده) میتوان چندین اینترفیس را پیاده سازی (Implement) نمود.
- C# بسیار typesafe تر از C++ است. تنها تبدیلات ضمنی مثل تبدیل نوع داده کوچکتر به بزرگتر یا تبدیل نوع مشتق شده به نوع پایه به طور پیش فرض و بدون خطا صورت میپذیرد.هیچ تبدیل ضمنی ای میانBooleanها و Integerها وجود ندارد و هر تبدیل user-defined بایستی به صراحت با یکی از کلمات explicit یا implicit نشانه گذاری شود. تبدیل b به a در حالتی که a یک Integer و b یک double باشد در زبان C++ مجاز است اما در C# به یک خطای زمان کامپایل منجر میشود(بایستی به صورت explicit تعریف شود)
- اعضای Enumeration در داخل محدوده شخصی خود قرار دارند.
- #C قابلیت syntactic sugar را برای توابع متداول، اکسسورها و ماجولهای کسول شده در یک کلاس به صورت ویژگیها قرار دادهاست. اکسسورها که خاصیت نیز گفته میشوند در زبان #C قادر به کنترل دسترسی اعضا و معتبرسازی دادهها هستند.
- تمام انواع بازتابی(Reflection) و بازیابی(Recovery) قابل استفادهاست.
ساختمان داده
این کمپابلر در مقابل C یا
C++ دارای ساختار بسیار متفاوتی است که دانستن آن به برنامه نویس امکان نوشتن برنامه های بسیار بهینه را خواهد داد.
- رشته ها: در C و یا C++ ساختار رشته به صورت آرایه ای از نوعchar بود که امکان اضافه کردن به رشته را محدود می کرد به دلیل ثابت بودن طول در آغاز تعریف ولی در #C دو نوع متفاوت رشته وجود دارد.که یکی به صورت آرایه ای با طول ثابت ۲۵۶ (در عمل ۲۵۵) موجوداست ( به صورت پیش فرض ) و در صورتی که با کمبود جا روبرو شود فضای جدید (بزرگتر) یافته و به ان انتقال می دهد. ولی در نوع دوم رشته ها از لیست پیوندی اسفاده می شود.
- انواع داده ها: CTS دادهها را به دو نوع "مقداري" و "مرجعي" تقسیم میکند. انواع دادهای توده سادهای از داده میباشند.نمونههای انواع دادهای نه هویت مرجعی دارند و نه مفاهیم مقایسه مراجع را. برای مقایسه برابری یا عدم برابری انواع دادهای، خود مقدار دادهها را با یکدیگر مقایسه میکنیم مگر اینکه عملگرهای مشابه دوباره تعریف شده باشند.مقادیر دادههای مرجعی همیشه یک مقدار پیش فرض دارند و همیشه میتوانند ایجاد و یا کپی شوند.یکی دیگر از محدودیتهای انواع دادهای این ات که آنها نمیتوانند از یکدیگر مشتق شوند(ولی میتوانند اشتراکاتی داشته باشند) و هم چنین نمیتوانند در سازنده مقدار دهی اولیه شوند. مثالی از انواع دادهای، بعضی از انواع اولیه مانند int و float و char و System.DateTime میباشند. در مقابل، انواع مرجعی مفهوم تعریف مرجعی را دارند( که در آن هر نمونه از نوع مرجع، به طور ذاتی از دیگر نمونهها جدا میشود، حتی اگر داده هر دو نمونه یکی باشد). این دقیقا نمونه مشابه مقایسه تساوی یا عدم تساوی دادههای مرجعی است، که در آن آزمایش برای مرجعها از دادهایها سریع تر است. در کل نه همیشه امکان تعریف نمونه مرجعی وجود دارد و نه امکان کپی یا نمایش مقادیر مقایسه دو نمونه.ولی به هر حال انواع مرجعی خاص میتوانند این اعمال را از طریق سازندههای عمومی یا اجرای واسطهای مشابه(مثل ICloneable یا IComparable) انجام دهند.نمونههایی از انواع مرجعی، اشیا، System.Stringو Sysmet.Array میباشند. هر دو نوع داده قابلیت انعطاف توسط تعریف به وسیله کاربر را دارند. در واقع وقتی ما نوع داده ای را به تابع ای ارسال میکنیم، آدرس داده نیز فرستاده میشود.البته این امر پیش فرض است ولی برای داده های مثل آرایه، رشته ای، آدرس فرستاده میشود و ارسال از نوع مرجع میشود