زبان برنامه نویسی سی شارپ – C Sharp یا #C
زبان برنامه نویسی سی شارپ یا C Sharp یک زبان برنامه نویسی چند شیوه ای است که شامل اصول وابستگی زیاد به نوع (Strong Typing)، دستوری، اعلانی، تابعی، جنریک یا جامع، شی گرا (مبتنی بر کلاس) و مبتنی بر کامپوننت است.زبان برنامه نویسی سی شارپ توسط شرکت مایکروسافت در پروژه .NET توسعه یافت و بعدها توسط استانداردهای Ecma و ISO به عنوان یک زبان برنامه نویسی استاندارد مورد تایید قرار گرفت.
اهداف طراحی
در استاندارد ECMA فهرست زیر به عنوان اهداف زبان برنامه نویسی سی شارپ مشخص شده است:
- این زبان باید یک زبان برنامه نویسی ساده، مدرن، همه منظوره و شی گرا باشد.
- این زبان برنامه نویسی و پیاده سازی های آن باید از اصول مهندسی نرم افزار مانند بررسی وابستگی زیاد به نوع، بررسی محدوده آرایه، شناسایی تلاش برای استفاده از متغیرهای مقداردهی نشده و بازیافت حافظه خودکار پشتیبانی کند. مواردی مانند استحکام نرم افزاری، پایداری و بهره وری برنامه نویس از اهمیت زیادی برخوردار هستند.
- زبان برنامه نویسی سی شارپ برای استفاده در توسعه کامپوننت های نرم افزاری در نظر گرفته شده است که برای توسعه در محیط های توزیع شده مناسب هستند.
- قابل حمل بودن برای کد منبع و برنامه نویس ها از اهمیت بالایی برخوردار است، مخصوصا برای کسانی که از قبل با زبان های برنامه نویسی C و C++ آشنایی دارند.
- پشتیبانی از بین المللی سازی بسیار مهم است.
- زبان برنامه نویسی #C باید برای نوشتن برنامه ها برای سیستم های میزبانی شده و سامانه های نهفته مناسب باشد. این سیستم ها شامل سیستم های خیلی بزرگ که از سیستم عامل های پیچیده استفاده می کنند تا سیستم های خیلی کوچک است که کارایی های مشخصی دارند.
- گرچه برنامه های سی شارپ باید از نظر ملزومات حافظه و قدرت پردازش اقتصادی عمل کنند، اما خود این زبان برای رقابت مستقیم از نظر عملکرد با زبان C یا Assembly طراحی نشده است.
اگر تصمیم به داشتن ارائه در زمینه زبانهای برنامه نویسی دارید پیشنهاد میکنیم از لینک زیر فایل آماده زبان سی شارپ را مطالعه کنید تاارائهای مفید و کاربردی داشته باشید.
تاریخچه زبان برنامه نویسی #C
در طی فرایند توسعه فریم ورک .NET، کتابخانههای کلاس در ابتدا توسط یک سیستم کامپایلر با کد مدیریت شده به نام Simple Managed C (SMC) نوشته شده بودند. در ژانویه سال ۱۹۹۹، آندرس هایلسبرگ یک تیم تشکیل داد تا یک زبان برنامه نویسی جدید به نام Cool بسازد که مخفف C-like Object Oriented Language یا زبان شی گرای مانند C بود.
شرکت مایکروسافت قصد داشت نام Cool را به عنوان نام نهایی این زبان نگه دارد، اما به خاطر دلایل مربوط به علامت تجاری از این کار صرف نظر کرد. زمانی که پروژه .NET در کنفرانس توسعه دهندگان حرفهای در جولای سال ۲۰۰۰ به طور عمومی اعلام شد، این زبان به #C تغییر نام داده شد و کتابخانههای کلاس و ASP.NET Runtime به #C انتقال داده شدند.
طراح اصول زبان برنامه نویسی سی شارپ و معمار ارشد شرکت مایکروسافت، آندرس هایلسبرگ است که در گذشته در طراحی Turbo Pascal، Embarcadero Delphi ، CodeGear Delphi، Inprise Delphi و Borland Delphi Visual J++ دست داشت. وی در محاسبهها و مقالات فنی اظهار کرده است که نقایص بیشتر زبانهای برنامه نویسی اصلی مانند C++، Java ،Delphi و Smalltalk اصول اولیه زمان اجرای زبان مشترک (Common Language Runtime – CLR) را بنا نهادند که بعدها باعث طراحی زبان #C شد.
جیمز گاسلینک که در سال ۱۹۹۴ زبان برنامه نویسی جاوا را ساخت و بیل جوی که یکی از موسسهای شرکت Sun Microsystems است، زبان برنامه نویسی #C را یک تقلید از جاوا دانستند. جیمز گاسلینگ در ادامه اظهار داشت که “سی شارپ به نوعی همان جاوا است که قابلیت اطمینان، خلاقیت و امنیت از آن حذف شده است”. کلاوس کرفت و آنجلیکا لانگر (مولفان کتاب های C++ streams) در یک پست وبلاگ اظهار کردند که “جاوا و سی شارپ تقریبا زبان های برنامه نویسی یکسانی هستند و این یک تکرار کسل کننده بدون نوآوری است.
افراد کمی ادعا خواهند کرد که جاوا و #C زبانهای برنامه نویسی انقلابی هستند که شیوه نوشتن برنامهها را تغییر دادهاند. زبان برنامه نویسی سی شارپ بسیاری از چیزها را از جاوا گرفته است و بالعکس. اکنون که #C از قابلیتهای Boxing و Unboxing پشتیبانی میکند، در جاوا هم ویژگیهای بسیار مشابهی اضافه خواهد شد. در جولای سال ۲۰۰۰، آندرس هایلسبرگ گفت که زبان سی شارپ تقلید از جاوا نیست و طراحی آن بیشتر به زبان C++ نزدیک است.
از زمان عرضه #C 2.0 در نوامبر سال ۲۰۰۵، زبانهای سی شارپ و جاوا مسیرهای تکامل متفاوتی را پیش گرفتهاند و شباهت آنها به هم کمتر شده است. یکی از تفاوتهای اصلی آنها با اضافه شدن Genericها به هر دو زبان با کاربردهای بسیار متفاوت آغاز شد. زبان برنامه نویسی سی شارپ از جسمیت دادن استفاده میکند تا اشیای جنریک کلاس اول فراهم کند که از آنها میتوان مانند هر کلاس دیگری استفاده کرد و تولید کد در زمان لود شدن کلاس انجام میشود.
به علاوه، #C چندین ویژگی مهم اضافه کرده است تا برنامه نویسی به سبک تابعی را تطبیق دهد و با افزونههای LINQ که در #C 3.0 عرضه شد و با پشتیبانی فریم ورک از عبارات Lambda و نوعهای ناشناس، به اوج خود رسید. این ویژگیها به بزبان برنامه نویسی سی شارپ اجازه میدهند تا در صورت مفید بودن برای برنامهاش، از تکنیکهای برنامه نویسی تابعی مانند closure ها استفاده کند.
افزونههای LINQ و Importهای تابعی به توسعه دهندگان کمک میکنند تا مقدار کدهای تکراری که در کارهای رایج مانند پرس و جو از یک پایگاه داده، تجزیه یک فایل xml یا جستجو در یک ساختار داده استفاده میشوند را کاهش دهند و بیشتر روی منطق برنامه تمرکز کنند تا خوانایی و قابلیت نگهداری را بهبود دهند.
زبان برنامه نویسی سی شارپ در گذشته یک نماد به نام اندی (برداشت از آندرس هایسلبرگ) داشت که در ۲۹ ژانویه سال ۲۰۰۴ بازنشسته شد.
زبان برنامه نویسی #C در ابتدا برای بررسی در کمیسیون فرعی ISO JTC 1/SC 22 ثبت شده بود، اما از آن خارج شد و تحت تایید ISO/IEC 23270:2006 قرار گرفت.
نام
نام سی شارپ “C Sharp” برگرفته از نت موسیقایی است که علامت # نشان میدهد که گام نت نوشته شده باید نیم پرده بالاتر نواخته شود. این مانند زبان برنامه نویسی C++ است که علامت ++ نشان میدهد که یک متغیر باید به علاوه مقدار ۱ گردد. علامت # همچنین نمایانگر یک لیگچر با چهار علامت + است (در یک شبکه دو در دو) که نشان میدهد این زبان توسعهای بر C++ است.
به دلیل محدودیتهای فنی برای نمایش (فونتهای استاندارد، مرورگرها و غیره) و اینکه نماد شارپ (U+266F ♯) در بیشتر کیبوردها موجود نیست، نماد عدد (U+0023 #) به صورت تقریبی انتخاب شد تا نمایانگر نماد شارپ در نام این زبان برنامه نویسی باشد. این تبدیل نماد در مشخصات زبان سی شارپ ECMA-334 آورده شده است. هرچند در صورت عملی بودن (مثلا برای تبلیغات یا روی جعبه ها مایکروسافت از همان نماد موسیقایی اصلی استفاده میکند.
پسوند شارپ توسط تعدادی از دیگر زبانهای .NET که تنوعی از زبانهای موجود هستند نیز استفاده شده است، از جمله J# یک زبان .NET که توسط مایکروسافت طراحی شده است و برگرفته از Java 1.1 است A# برگرفته از ADA و زبان برنامه نویسی تابعی F# نسخه اولیه Eiffel for .NET به نام Eiffel# نامیده میشد. این نام اکنون منسوخ شده است، زیرا زبان کامل Eiffel پشتیبانی میشود. از این پسوند همچنین برای کتابخانههایی مانند Gtk# یک الگوی آداپتور .NET برای GTK+ و دیگر کتابخانههای GNOME و Cocoa# یک الگوی آداپتور برای Cocoa استفاده شده است.
ویژگی های اضافه شده در ورژن های مختلف
#C 2.0
- جنریکها
- نوعهای جزئی
- متدهای ناشناس
- تکرار کنندهها
- نوعهای Nullable
- دسترسی جداگانه Getter/setter
- تبدیلهای گروهی متد (delegate ها)
- متغیرهای مشترک و متقابل برای delegate ها
- کلاسهای استاتیک
- استنباط delegate
#C 3.0
- متغیرهای Local با نوع مشخص
- مقداردهنده های اولیه Object و Collection
- خصوصیات اجرا شده خودکار
- نوع های ناشناس
- متدهای Extension
- عبارات Query
- عبارات Lambda
- درخت های Expression
- متدهای جزئی
#C 4.0
- اتصال دینامیک
- آرگومان های نام گذاری شده و اختیاری
- Covariance و Contravariance جنریک
- نوع های Embedded interop
#C 5.0
- متدهای ناهمگام
- خصیصه های Caller Info
#C 6.0
- کامپایلر به عنوان یک سرویس (Roslyn)
- وارد کردن اعضای نوع استاتیک به Namespace
- فیلترهای استثنا
- انتظار در بلوک های catch/finally
- مقداردهنده های اولیه با خصوصیت خودکار
- مقادیر پیش فرض برای خصوصیاتی که تنها getter دارند
- اعضای Expression-bodied
- تکثیر دهنده Null (عملکرد شرطی Null یررسی Null مختصر)
- درون یابی رشته
- عملگر nameof
- مقداردهنده اولیه دیکشنری
#C 7.0
- Literal های دودویی
- تفکیک کننده های رقم
- توابع Local
- Type switch
- Return های Ref
- تاپل های نام گذاری شده
- Out var
- تطبیق الگو
- Return های Asynch اختیاری
- Getter ها و Setter های Expression bodied
- Constructor ها و finalizer های Expression bodied
#C ۸.۰
· انواع Nullable های مرجع
· بهبود یافتن تطبیق الگو
· جریان های ناهمزمان
· دامنه ها و شاخص ها
· استفاده از Decleration
· توابع محلی استاتیک
· ساختار های یکبار مصرف
قاعده نحوی
قاعده نحوی اصلی زبان زبان برنامه نویسی سی شارپ مانند دیگر زبانهای سبک C است، مانند C، C++ و جاوا.
- از نقطه ویرگول برای مشخص کردن انتهای عبارت استفاده میشود.
- از آکولادها برای گروه بندی عبارتها استفاده میشود. عبارات معمولا در داخل متدها (توابع)، توابع در داخل کلاسها و کلاس ها در داخل Namespaceها گروه بندی میشوند.
- متغیرها توسط علامت مساوی تخصیص داده میشوند، اما با استفاده از دو علامت مساوی مقایسه میشوند.
- از کروشهها برای ارایهها استفاده میشود، هم برای اعلان کردن آنها و هم برای گرفتن یک مقدار در شاخص خاصی از آنها.
جهت یادگیری زبان برنامه نویسی سی شارپ میتوانید دوره آموزشی موجود در مجموعه پی استور را از لینک زیر دانلود و مطالعه کنید.
ویژگیهای بارز زبان برنامه نویسی #C
برخی از ویژگیهای بارز #C که آن را از C++، C و جاوا متمایز میکنند شامل موارد زیر است:
قابلیت حمل
زبان برنامه نویسی سی شارپ طوری طراحی شده است که مستقیما نمایانگر زیرساخت زبان مشترک است. بیشتر نوعهای درونی آن متناظر با نوعهای مقداری است که توسط فریم ورک CLI بکار گرفته شده است. هرچند در مشخصات زبان، ملزومات تولید کد کامپایلر آورده نشده است، یعنی نگفته است که یک کامپایلر #C باید یک Runtime زبان مشترک را هدف قرار دهد یا زبان واسطه مشترک تولید کند یا هر فرمت خاص دیگری را تولید کند. به صورت تئوری، یک کامپایلر #C می تواند مانند کامپایلرهای سنتی C++ یا Fortran، کدهای ماشینی تولید کند.
وابستگی به نوع
زبان برنامه نویسی سی شارپ از اعلانهای متغیرهای ضمنی وابسته زیاد به نوع با کلمه کلیدی var و از آرایههای نوع ضمنی با کلمه کلیدی new [] به همراه یک آغازگر Collection پشتیبانی میکند.
زبان برنامه نویسی سی شارپ از یک نوع داده بولی محض با کلمه کلیدی bool پشتیبانی میکند. عبارات شرطی مانند while و if نیازمند یک Expression از نوعی هستند که از عملگر true استفاده میکند، مانند نوع بولی. با اینکه C++ یک نوع بولی دارد، میتوان آن را آزادانه به اعداد صحیح تبدیل کرد و Expression هایی مانند if(a) تنها نیاز به این دارند که a قابل تبدیل به bool باشد و اجازه میدهند a یک int یا یک نشانگر باشد.
زبان برنامه نویسی سی شارپ اجازه این رویکرد “اعداد صحیح به معنی true یا false را نمی دهند، به این دلیل که وادار کردن برنامه نویسها به استفاده از عباراتی که نتیجه آنها دقیقا bool است میتواند از بروز برخی مشکلات برنامه نویسی جلوگیری کند، مانند i f (a = b) (استفاده از اختصاصگر = به جای برابری = = که با اینکه در C یا C++ یک خطا نیست، توسط کامپایلر مشخص میشود.
زبان برنامه نویسی سی شارپ بیشتر از C++ ایمنی نوع دارد. تنها تبدیلهای ضمنی پیش فرض آنهایی هستند که ایمن هستند، مانند گسترش دادن اعداد صحیح. این کار در زمان کامپایل کردن، هنگام JIT و گاهی مواقع هنگام اجرا صورت میگیرد. هیچ تبدیل ضمنی بین مقادیر بولی و اعداد صحیح صورت نمی گیرد، همچنین بین اعداد شمارشی و اعداد صحیح (به جز مقدار Literal صفر که میتوان آن را به طور ضمنی به هر نوع شمارشی تبدیل کرد). هر نوع تبدیل توسط کاربر باید به عنوان واضح یا ضمنی مشخص شود، برخلاف Constructorهای کپی و عملگرهای تبدیل C++ که هر دو به طور پیش فرض ضمنی هستند.
زبان برنامه نویسی #C از covariance و contravariance در نوعهای جنریک بوضوح پشتیبانی میکند، برخلاف C++ که تنها از طریق معناشناسی نوعهای Return در متدهای مجازی تا حدی از contravariance پشتیبانی میکند.
اعضای Enumeration در Scope مربوط به خود قرار داده میشوند.
زبان برنامه نویسی #C اجازه متغیرها یا توابع Global را نمیدهد. تمام متدها و اعضا باید در داخل کلاسها اعلان شوند. اعضای استاتیک از کلاسهای Public میتوانند جایگزین متغیرها و توابع Global شوند.
متغیرهای Local نمیتوانند متغیرهای بلوک محصور کننده را بپوشانند.
برنامه نویسی متا
برنامه نویسی متا از طریق خصیصههای 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
یک namespace سی شارپ همان سطح از انزوای کد را مانند Package در جاوا یا namespace در C++ ارائه میکند که قوانین و ویژگیهای آن بسیار مشابه package است.
دسترسی به حافظه
زبان برنامه نویسی سی شارپ، از نشانگرهای آدرس حافظه تنها میتوان در بلوکهایی استفاده کرد که به عنوان 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، گسترش داد.
سیستم نوع رایج
زبان برنامه نویسی سی شارپ یک سیستم از نوع یکپارچه دارد. این سیستم نوع یکپارچه، سیستم نوع مشترک (Common Type System – CTS) نام دارد.
یک سیستم نوع یکپارچه دلالت بر این دارد که تمام نوعها از جمله Primitiveهایی مانند اعداد صحیح، زیرکلاسی از کلاس System.Object هستند. برای مثال، هر نوعی یک متد ToString () را به ارث میبرد.
دسته بندی های نوع های داده
CTS نوعهای داده را به دو دسته تقسیم میکند:
- نوع های مرجعی
- نوع های مقداری
نمونههای نوعهای مقداری دارای هویت ارجاعی یا معناشناسی مقایسه ارجاعی نیستند – مقایسههای برابری و عدم برابری برای نوعهای مقداری، مقادیر حقیقی داده را در داخل نمونهها مقایسه میکنند، مگر اینکه عملگرهای مربوطه سربارگزاری شده باشند. نوعهای مقداری برگرفته از System.ValueType هستند، همیشه یک مقدار پیش فرض دارند و همیشه میتوانند ایجاد یا کپی شوند.
چند محدودیت دیگر نوعهای مقداری این است که نمیتوانند از یکدیگر گرفته شوند (اما می توانند رابط ها را به کار گیرند) و نمیتوانند یک constructor پیش فرض واضح (بدون پارامتر) داشته باشند. نمونههای نوعهای مقداری تمام نوعهای primitive مانند int یک عدد صحیح ۳۲ بیتیfloat یک عدد ممیز شناور ۳۲ بیتیchar یک واحد کد یونیکد ۱۶ بیتی و System.DateTime یک نقطه خاص در زمان با دقت نانوثانیه را شناسایی میکند هستند. مثالهای دیگر شامل enum (enumerations) و struct (ساختارهای تعریف شده توسط کاربر) هستند.
برعکس، نوعهای مرجعی دارای مفهوم هویت ارجاعی هستند – هر نمونه از یک نوع مرجعی ذاتا متمایز از دیگر نمونهها است، حتی اگر دادههای داخل هر دو نمونه یکی باشد. این موضوع در مقایسههای پیش فرض برابری و عدم برابری برای نوعهای مرجعی مشهود است که به جای برابری ساختاری، برابری ارجاعی را تست میکنند مگر اینکه عملگرهای مربوطه سربارگزاری شده باشند.
مانند مورد System.String. به طور کلی، همیشه ممکن نیست که یک نمونه از نوع مرجعی بسازیم یا یک نمونه موجود را کپی کنیم یا یک مقایسه مقداری بین دو نمونه موجود انجام دهیم، البته نوعهای مرجعی خاصی میتوانند با رو کردن یک Public Constructor یا بکارگیری یک رابط متناظر مانند ICloneable یا Icomparable چنین خدماتی را ارائه کنند. مثالهایی از نوعهای مرجعی شامل object کلاس مبنای نهایی برای تمام دیگر کلاسهای #C، System.String (یک رشته از کاراکترهای یونیکد) و System.Array یک کلاس مبنا برای تمام آرایه های #C هستند.
هر دو نوع قابل توسعه با نوعهای تعریف شده توسط کاربر هستند.
Boxing و Unboxing
Boxing، فرایند تبدیل یک شی نوع مقداری به مقدار یک نوع مرجعی متناظر است. عمل Boxing در زبان برنامه نویسی سی شارپ ضمنی است.
عمل Unboxing، فرایند تبدیل مقدار یک نوع مرجعی که قبلا Boxed بوده به مقدار یک نوع مقداری است. عمل Unboxing در زبان برنامه نویسی سی شارپ نیازمند یک تبدیل نوع واضح است. یک شی Boxed از نوع T تنها می تواند به یک Tیا یک Nullable T Unbox شود.
مثال:
int foo = 42; // Value type object bar = foo; // foo is boxed to bar int foo2 = (int)bar; // Unboxed back to value type
کتابخانه ها
مشخصات C Sharp یک مجموعه کمینه از نوع ها و کتابخانه های کلاس را مشخص کرده است که از کامپایلر انتظار می رود داشته باشد. در عمل، C Sharp در اکثر اوقات با بکارگیری کمی زیرساخت زبان مشترک مورد استفاده قرار می گیرد که به عنوان ECMA-335 Common Language Infrastructure استاندارد شده است.
مثال ها
کد زیر یک برنامه ساده C Sharp است که یک نسخه کلاسیک از مثال “Hello World” است:
;using System class Program { static void Main(string[] args) { ;Console.WriteLine("Hello, world!") } }
چیزی که در برنامه نمایش داده می شود، این است:
Hello, world!
هر خط، دارای یک هدف است:
;using System
کد بالا به کامپایلر می گوید که از System به عنوان یک پیشوند برای نوع های استفاده شده در کد منبع استفاده کند. در این مورد وقتی کامپایلر بعدا استفاده از نوع Console در کد منبع را ببیند، سعی می کند یک نوع به نامد console را ابتدا در مجموعه کنونی و سپس در تمام مجموعه های ارجاع شده، پیدا کند. در این مورد، کامپایلر نمی تواند چنین نوعی را پیدا کند، زیرا نام این نوع در واقع System.Console است. سپس کامپایلر سعی می کند با استفاده از پیشوند system از عبارت using ، یک نوع به نام System.Console را پیدا کند و این بار موفق می شود.
عبارت using به برنامه نویس اجازه می دهد به جای استفاده از اسامی کامل در تمام مواقع، تمام پیشوندهای نامزد برای استفاده در طی عمل کامپایل را اعلام کند.
class Program
کد بالا یک تعریف کلاس است. هر چیزی که بین کروشه های زیر باشد، program را توصیف می کند.
static void Main(string[] args)
این متد class member را اعلام می کند که اجرای برنامه شروع می شود. .NET runtime متد Main را فراخوانی می کند. (توجه: Main را مانند بقیه متدها از جای دیگری هم می توان فراخوانی کرد. مثلا از یک متد دیگر یا از program ). کلمه کلیدی static متد را بدون نمونه ای از program قابل دسترسی می کند. تمام نقاط ورودی Main از برنامه کنسول باید به عنوان static اعلام شوند. در غیر این صورت برنامه به یک نمونه نیاز خواهد داشت، اما هر نمونه ای به یک program نیاز دارد.
برای رفع این وابستگی دایره ای غیر قابل حل، اگر متد static Main وجود نداشته باشد، کامپایلرهای #C که برنامه های کنسول را پردازش می کنند (مانند بالا) یک خطا گزارش می کنند. کلمه کلیدی void اعلام می کند که main دارای مقدار بازگشتی نیست.
;Console.WriteLine("Hello, world!")
این خط از کد، خروجی را می نویسد. Console یک کلاس استاتیک در فضای نام system است. این یک رابط برای ورودی، خروجی و جریان های خطا برای برنامه های کنسول فراهم می کند. این برنامه، مند WriteLine از console را فراخوانی می کند که یک خط با آرگومان رشته “Hello World!” را روی کنسول نمایش می دهد.
یک مثال از رابط کاربری گرافیکی:
;using System.Windows.Form class Program { static void Main(string[] args) { ;MessageBox.Show("Hello, World!") ;System.Console.WriteLine("Is almost the same argument!") } }
این مثال مشابه مثال قبلی است، اما به جای نوشتن پیام “Hello World!” روی کنسول، یک دیالوگ باکس تولید می کند که آن پیام را نمایش می دهد.
استانداردسازی و صدور مجوز
در آگوست سال ۲۰۰۱، شرکت مایکروسافت، هیولت پاکارد و اینتل با هم ثبت مشخصات برای زبان برنامه نویسی سی شارپ و همچنین زیرساخت زبان مشترک در سازمان استاندارد Ecma International را حمایت کردند. در دسامبر سال ۲۰۰۱، سازمان ECMA مشخصات زبان ECMA-334 #C را منتشر کرد. زبان برنامه نویسی سی شارپ در سال ۲۰۰۳ تبدیل به استاندارد ISO شد. سازمان ECMA در گذشته مشخصات مشابهی را به عنوان دومین نسخه از #C در دسامبر سال ۲۰۰۲ به تصویب رسانده بود.
در ژوئن سال ۲۰۰۵، سازمان ECMA این استاندارد و گزارش های فنی مربوطه را از طریق فرایند Fast-Track در ISO/IEC JTC 1 ثبت کرد. این فرایند معمولا ۶ تا ۹ ماه زمان می برد.
تعریف زبان برنامه نویسی #C و CLI تحت استانداردهای ISO و ECMA استانداردسازی شده اند که حمایت مجوز منطقی و بدون تبعیض بر علیه ادعاهای ثبت اختراع ارائه می کنند.
شرکت مایکروسافت پذیرفته است که از توسعه دهندگان کد باز به خاطر نقض حق امتیاز بخشی از فریم ورک که تحت پوشش OSP است، برای پروژه های غیرتجاری شکایت نکند. شرکت مایکروسافت همچنین پذیرفته است که حق امتیازهای مربوط به محصولات شرکت Novell را علیه مشتریان Novell به اجرا نگذارد، به استثنای لیستی از محصولات که بوضوح اشاره ای به #C، .NET یا پیاده سازی Novell از .NET ندارند. هرچند شرکت Novell اظهار دارد که Mono از هیچ یک از حق امتیازهای مایکروسافت تعدی نکرده است. شرکت مایکروسافت همچنین توافق کرده است که حقوق ثبت اختراع مربوط به پلاگین مرورگر Moonlight را به اجرا نگذارد که به Mono وابسته است، درصورتی که از طریق شرکت Novell تهیه شده باشد.
پیاده سازی ها
مرجع کامپایلر سی شارپ، #Microsoft Visual C است که کد باز است.
شرکت مایکروسافت هدایت توسعه کامپایلر جدید #C کد باز و مجموعه ابزارهایی که اسم رمز آن در گذشته Roslyn بوده است را برعهده دارد. این کامپایلر که کاملا با کد مدیریت شده (C Sharp) نوشته شده، باز شده است و کارایی آن به عنوان API ها رو شده است. بنابراین توسعه دهندگان را قادر کرده است تا ابزارهای فاکتورگیری جدید و عیب یابی بسازند.
کامپایلرهای C Sharp دیگری هم هستند که شامل یک پیاده سازی از زیرساخت زبان مشترک و کتابخانه های کلاس .NET تا .NET 2.0 هستند.
- پروژه Mono یک کامپایلر C Sharp کد باز را فراهم می کند که یک پیاده سازی کاملا کد باز از زیرساخت زبان مشترک است.
- پروژه Mono شامل کتابخانه های فریم ورک مورد نیاز به صورتی که در مشخصات ECMA آمده است و همچنین یک پیاده سازی تقریبا کامل شده از کتابخانه های کلاس .NET اختصاصی مایکروسافت تا .NET 3.5 هستند. برای Mono 2.6 هنوز هیچ طرحی برای به کارگیری WPF وجود ندارد. WF برای انتشار بعدی برنامه ریزی شده است و تنها پیاده سازی های جزئی از LINQ to SQL و WCF وجود دارد.
- پروژه DotGNU (اکنون متوقف شده است) نیز یک کامپایلر کد باز #C فراهم کرده بود که تقریبا یک پیاده سازی کامل از زیرساخت زبان مشترک و شامل کتابخانه های فریم ورک مورد نیاز به صورتی که در مشخصات ECMA آمده اند و زیرمجموعه ای از برخی از باقی مانده کتابخانه های کلاس .NET اختصاصی مایکروسافت تا .NET 2.0 بود آنهایی که مستند نشده و در مشخصات ECMA شامل نشده اند، اما در توزیع فریم .NET استاندارد مایکروسافت شامل شده اند.
- پروژه Rotor مایکروسافت در حال حاضر زیرساخت به اشتراک گذاشته شده منبع زبان مشترک نامیده می شود. دارای مجوز تنها برای مصارف آموزشی و تحقیقاتی است. یک پیاده سازی با منبع مشترک از CLR runtime و یک کامپایلر C Sharp و زیرمجموعه ای از کتابخانه های فریم ورک زیرساخت زبان مشترک در مشخصات ECMA را فراهم می کند تا #C 2.0 را بتوان روی ویندوز Xp استفاده کرد.
برای نوشتن پروژههای مختلف و بزرگ میتوانید با ادغام زبان سی شارپ و قابلیت شی گرایی این کار را انجام دهید. برای آشنایی شما با شی گرایی پاورپوینتی توسط مجموعه پی استور گردآوری و طراحی شده که میتوانید از لینک زیر دانلود کنید.
سخن آخر
زبان برنامهنویسی سیشارپ بهعنوان یکی از ابزارهای قدرتمند در دنیای توسعه نرمافزار شناخته میشود که با ترکیب قابلیتهای شیءگرایی، کارایی بالا، و پشتیبانی از مجموعه وسیعی از کاربردها از توسعه برنامههای دسکتاپ و موبایل گرفته تا بازیسازی و وبمحور، جایگاه ویژهای در میان زبانهای مدرن دارد.
ما در مقاله فوق به معرفی این زبان، تاریخچه و ویژگیهای بارز این زبان با زدن مثالهایی پرداختیم که امیدواریم برای برنامه نویسان عزیز مفید واقع شود زیرا با توجه به روند رو به رشد تکنولوژی و نیاز به توسعه نرمافزارهای پیچیده، آشنایی با سیشارپ بهعنوان یک مهارت کلیدی برای هر توسعهدهنده نرمافزار ضروری است.
2 پاسخ
تا حالا در مورد سی شارپ مقاله کاملی نخونده بودم. خیلی خوب توضیح دادین
نوشته کاملی بود. موفق باشید.