این مقاله ترجمه شده است و ممکن است برخی از مطالب قابل ترجمه نباشد ، به همین دلیل به مرور بروز رسانی خواهد شد .
در این مقاله با تاریخچه سی شارپ آشنا خواهیم شد. تیم دات نت همچنان در حال افزودن ویژگی های جدید به این زبان محبوب هست. چیزی که قابل توجه هست ، این مقاله را می توانید از طریق وب سایت مایکروسافت با جزئیات کامل ببنید.
زبان سی شارپ به انواع و متدهایی که در کتابخانه های کلاس فراهم شده متکی است . این کتابخانه های کلاس به واسطه پلتفرم دات نت ، در تعدادی بسته ارایه شده است.برای مثال پردازش استثنا یکی از مواردی است که به عنوان یکیج معرفی شده است. برای اطمینان از اینکه شیء پرتاب شده از Exception مشتق شده باشد ، هر عبارت یا وضعیت ارسال شده بررسی می شود. به طور مشابه، هر درخواست مهار شده (Catch) برای اطمینان از اینکه نوع گرفتار شده از Exception مشتق شده باشد بررسی می شود. این روند کمک بسیار زیادی به برنامه نویس میکند تا خطاها را بتواند Handle کند.هر نسخه جدید امکانات بیشتری اضافه میکند. برای استفاده از آخرین ویژگیهای زبان در محیطهای قدیمیتر، ممکن است نیاز به نصب کتابخانههای خاصی داشته باشید.
وقتی به عقب برگردید و نگاه کنید، نسخه C# 1.0 که با ویژوال استودیو دات نت 2002 منتشر شد، بسیار شبیه جاوا بود. به عنوان بخشی از اهداف طراحی اعلام شده خود برای ECMA، به دنبال این بود که یک زبان شی گرا ساده، مدرن و همه منظوره باشد. در آن زمان، شبیه جاوا، به این معنی بود که به آن اهداف اولیه طراحی دست یافت.
اما اگر اکنون به C# 1.0 نگاهی بیاندازید، گیج و مبهوت میشید . فاقد قابلیتهای همگامسازی داخلی و برخی از عملکردهای نرم و روان در مورد جنریک ها بود که برای شما الان یک قابلیت ضروری است. در واقع، به طور کلی فاقد جنریک ها بود و LINQ؟ هنوز در دسترس نبود . این اضافات چند سال طول می کشید تا ظاهر شوند.
نسخه C# 1.0 در مقایسه با امروز فاقد ویژگی به نظر می رسید. اما با این حال، شما باید از یک جایی شروع می کردید. C# نسخه 1.0 جایگزین مناسبی برای جاوا در پلتفرم ویندوز بود.
ویژگی های اصلی C# 1.0 عبارتند از:
این ورژن ازسی شارپ با Visual Studio .NET 2003 ارائه شد. این نسخه شامل تغییرات کوچکی بود . قابل توجه ترین تغییری که در این نسخه بود ، وقتی که یک حلقه foreach را صدا می زدید اگر IEnumerator اینترفیس IDisposable را پیاده سازی کرده بود ،بعد از اجرای حلقه متد Dispose روی IEnumerator صدا زده می شد.
این نسخه از سی شارپ در سال 2005 همراه با ویژوال استودیو 2005 معرفی شد . شروعی جالب در راه بود . چه ویژگی هایی داشت ؟ بریم ببینیم:
سایر ویژگی های ورژن 2.0:
با جنریک ها، انواع و متد ها می توانند بر روی یک نوع دلخواه عمل کنند و در عین حال ایمنی نوع (Type) را حفظ کنند. به عنوان مثال، داشتن <T>List
درنسخه جدید سی شارپ ،تکرار کننده ها آمدند، به طور مختصر ، تکرار کننده ها به ما این امکان را می دهند که همه موارد موجود در یک لیست را با استفاده از یک حلقه foreach بررسی کنیم. این قابلیت خوانایی کد و توانایی افراد برای تجزیه و تحلیل را افزایش می دهد.
با این وجود سی شارپ هنوز هم از قابلیت های جاوا استفاده میکرد . زیرا این قابلیت ها قبلا در جاوا وجود داشت . اما این موضوع به زودی تغییر کرد چرا که این دو زبان از هم جدا شدند.
سی شارپ 3 سال 2007 همراه با ویژوال استودیو 2008ارائه شد. و همراه با آن .Net Framework 3.5 نیز ارائه شد. در این نسخه تغییرات بزرگی ایجاد شد.
در نگاهی به گذشته، بسیاری از این ویژگی ها هم اجتناب ناپذیر و هم غیرقابل تفکیک به نظر می رسند. همه آنها از نظر استراتژیک با هم هماهنگ هستند. به نظر می رسد که قاتل ویژگی های نسخه های قبلی سی شارپ ، query expression است که به عنوان Query یکپارچه با زبان (LINQ) نیز شناخته می شود.
یک نمای ظریف تر، ویژگی های Experssion Tree ، عبارات لامبدا و انواع ناشناس (Anonymous Types) است که به عنوان پایه ای که LINQ بر اساس آن ساخته می شود، را بررسی می کند. اما، در هر صورت، C# 3.0 یک مفهوم انقلابی ارائه کرد. C# 3.0 شروع به ایجاد زمینه برای تبدیل C# به یک زبان ترکیبی شی گرا / تابعی کرده بود.
به طور خاص، اکنون میتوانید پرسوجوهایی به سبک SQL بنویسید تا عملیاتهایی را بر روی مجموعهها انجام دهید. به جای نوشتن یک حلقه for برای محاسبه میانگین لیستی از اعداد صحیح، اکنون می توانید این کار را به سادگی با متد () list.Average انجام دهید. ترکیبی از query expressions و extension methods باعث شد به نظر برسد که لیستی از اعداد صحیح بسیار هوشمندتر شده است.
زمان لازم بود تا مردم واقعاً این مفهوم را درک کنند و یکپارچه کنند، اما به تدریج این اتفاق افتاد و اکنون، پس از سال ها ، کد های سی شارپی بسیار مختصر، سادهتر و کاربردیتر شده است.
این نسخه در سال 2010 همراه با Visual Studio 2010 ارائه شد .با وجود امکانات سی شارپ 3.0 و خارج شدن سی شارپ از زیر سایه زبان جاوا و پیشرفت روز افزون سی شارپ، محبوبیت این زبان روز به روز بیشتر میشد.
در نسخه 4.0 سی شارپ امکانات جالبی اضافه شد:
Embedded interop Types یا انواع Interop تعبیه شده ، به شما کمک میکند تا فایل های اطلاعات COM کمتری در زمان ایجاد یک اپلیکیشن ایجاد کنید. به جای ایجاد فایل های اطلاعات COM جدا گانه ، آنها به صورت داخلی ایجاد می شوند.
Generic covariant and contravariant که بیشتر مورد توجه نویسندگان چارچوب یا Framework مورد توجه قرار گرفته بود زیرا که بیشتر به صورت آکادمیک بود تا عمومی.
پارامترهای نامگذاری شده و اختیاری به شما این امکان را می دهند که بسیاری از اضافه بارهای متدها را حذف کنید و راحتی استفاده از آنها را فراهم کنید.
یکی از ویژگی های جدید ، معرفی کلمه کلیدی dynamic بود .کلمه کلیدی dynamic کامپایلر زمان اجرا را از کامپایل نوع، برخی از دستوارت معاف میکند. با این کلمه کلیدی می توانید ساختارهایی شبیه به زبان های برنامه نویسی پویا(dynamically typed languages ) ایجاد کنید. مانند زبان جاوا اسکریپت.
مثال زیر را ببینید :
dynamic x = "a string";
x = x + 6;
Console.WriteLine(x);
ابتدا یک متغییر dynamic ایجاد کرده ایم و سپس عدد 6 را با آن جمع زده ایم . می بینید که زمان کامپایل چه اتفاقی می افتد.
a string6
البته این قابلیت امکان مدیریت و تشخیص خطا را سخت تر می کند ولی از طرفی یک زبان برنامه نویسی را قدرتمندتر می کند.
این نسخه از سی شارپ همراه با Visual Studio 2012 منتشر شد . تمام تمرکز این نسخه از سی شارپ روی تقویت هر چه بهتر زبان بود. بله درست متوجه شدید:
مدل async و await برای برنامه نویسی غیرهمزمان.
همچنین در مورد Caller info Attributes می توانید در این لینک بیشتر مطالعه کنید.
Caller info attributes به شما این امکان را می دهد که به راحتی اطلاعاتی را در مورد context ی که در آن در حال اجرا هستید را ردیابی (tracking) کنید، بدون استفاده از تعداد زیادی کد reflection.
اما async و await ستاره های واقعی این نسخه از سی شارپ هستند.با ارائه این ویژگی ها مایکروسافت برگ برنده خود را رو کرد. اگر تا به حال با عملیات طولانی در حال اجرا و پیاده سازی وب تماس های برگشتی سروکار داشته اید، احتمالاً این ویژگی زبان را دوست داشته اید. اگر تا به حال با عملیات طولانی در حال اجرا و پیاده سازی callbacks های وب سروکار داشته اید، این ویژگی زبان سی شارپ رو قطعا دوست خواهید داشت.
با نسخه های 3.0 و 5.0 سی شارپ ، ویژگی های خوب و جدیدی به زبان شئ گرای سی شارپ اضافه شده بود.
نسخه 6.0 سی شارپ همراه با Visual Studio 2015 منتشر شد . برعکس ورژن 3.0 و 5.0 این نسخه ویژگی عمده و بزرگی به همراه نداشت . اما با بسیاری از وِیژگی های کوچک منتشر شد.
در اینجا به برخی از آنها اشاره می کنیم:
و همچنین :
هر کدام از این ویژگی ها در نوع خود جالب هستند. اما اگر به طور کلی به آنها نگاه کنید، یک الگوی جالب می بینید. در این نسخه، سی شارپ برای اینکه کدها مختصرتر و خواناتر شوند، کد نویسی به صورت boilerplate را حذف کرد. بنابراین برای طرفداران کد ساده و تمیز، این نسخه ی زبان ، یک پیروزی بزرگ بود.
همچنین یک کار دیگر را همراه با این نسخه انجام دادند، اگرچه این به خودی خود یک ویژگی زبان سنتی محسوب نمی شود . آنها کامپایلر Roslyn را به عنوان یک سرویس منتشر کردند. کامپایلر سی شارپ Roslyn حالا به زبان سی شارپ نوشته شده است و شما می توانید از کامپایلر Roslyn به عنوان بخشی از روند برنامه نویسی خود استفاده کنید.
نسخه 7.0 سی شارپ همراه با Visual Studio 2017 منتشر شد . این نسخه دارای موارد تکمیلی و جالبی در C# 6.0 است، اما بدون کامپایلر به عنوان یک سرویس. در اینجا برخی از ویژگی های جدید آورده شده است:
و همچنین :
همه این ویژگیها قابلیتهای جدید و جالبی را برای توسعهدهندگان و فرصتی برای نوشتن کدهای تمیزتر از همیشه ارائه میکنند. نکته جالب تر در این نسخه، تراکم اعلان متغیرها با استفاده از کلمه کلیدی out و تحویل دادن چندین مقدار برگشتی با استفاده از Tuple بود .
اما سی شارپ در حال گسترده تر شدن است. NET Core اکنون هر سیستم عاملی را مورد هدف قرار می دهد و چشمانش را محکم به Cloud و قابلیت حمل بودن می دوزد. این قابلیت های جدید مطمئناً علاوه بر ارائه ویژگی های جدید ، افکار و زمان طراحان زبان را به خود مشغول می کند.
مایکروسافت شروع به انتشار نسخه های نقطه ای با C# 7.1 کرد. این نسخه عنصر پیکربندی انتخاب نسخه زبان، سه ویژگی زبان جدید و رفتار کامپایلر جدید را اضافه کرد.
قابلیت های جدیدی که به این نسخه اضافه شده :
نقطه ورود یا شروع یک برنامه می تواند به صورت async باشد.
T[] InitializeArray<T>(int length, T initialValue = default)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException(nameof(length), "Array length must be nonnegative.");
}
var array = new T[length];
for (var i = 0; i < length; i++)
{
array[i] = initialValue;
}
return array;
}
void Display<T>(T[] values) => Console.WriteLine($"[ {string.Join(", ", values)} ]");
Display(InitializeArray<int>(3)); // output: [ 0, 0, 0 ]
Display(InitializeArray<bool>(4, default)); // output: [ False, False, False, False ]
System.Numerics.Complex fillValue = default;
Display(InitializeArray(3, fillValue)); // output: [ (0, 0), (0, 0), (0, 0) ]
در سی شارپ 7.1 میتوانید از کلمه default برای مقدار پیشفرض یک نوع استفاده کنید،تا زمانی که کامپایلر بتواند نوع expressions را تشخیص دهد.
در بسیاری از موارد می توان نام عناصر تاپل را از مقداردهی اولیه آن تشخیص داد.
می توانید از عبارات تطبیق الگو در متغیرهایی استفاده کنید که نوع آنها یک پارامتر نوع جنریک است.
در نهایت، کامپایلر دو گزینه دارد -refout و -refonly که کنترل تولید اسمبلی مرجع را بر عهده دارد.
این نسخه چند ویژگی کوچک به همراه داشت :
ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]);
دو موضوع اصلی در نسخه سی شارپ 7.3 وجود دارد. یک موضوع، ویژگی هایی را ارائه می دهد که کد ایمن را قادر می سازد به اندازه کد ناامن کارایی داشته باشد. موضوع دوم بهبودهای تدریجی را برای ویژگی های موجود فراهم می کند. گزینه هایی جدید برای کامپایلر نیز در این نسخه اضافه شده است.
ویژگی های زیر باعث افزایش عملکرد کد های ایمن می شود:
گزینه های بهبود یافته به شرح زیر است :
ویژگی های جدید کامپایلر :
-publicsign برای فعال کردن امضای اسمبلی ها با نرم افزار منبع باز (OSS).
-pathmap برای ارائه یک نقشه برای دایرکتوری های منبع.
این نسخه اولین نسخه از زبان سی شارپ هست که به طور اختصاصی NET CORE. را مورد هدف قرار می دهد. برخی از ویژگی های این نسخه به CLR مرتبط هست. برخی از آنها هم به کتابخانه های اضافه شده به NET CORE. هست.
ویژگی های نسخه 8.0 به صورت زیر است:
اعضای Interface پیشفرض به پیشرفتهایی در CLR نیاز دارند. این ویژگی ها در CLR برای NET CORE 3.0. اضافه شدند. محدودهها(Ranges) و فهرستها (Indexes) و جریانهای ناهمزمان (asynchronous streams) به انواع جدیدی در کتابخانههای NET Core 3.0 نیاز دارند. انواع ارجاعی Nullable، زمانی که در کامپایلر پیادهسازی میشوند،نسبت به زمانی که کتابخانهها برای ارائه اطلاعات معنایی در مورد وضعیت null آرگومانها و مقادیر بازگشتی حاشیهنویسی میشوند، خیلی مفیدتر است. این حاشیه نویسی ها و پیاده سازی ها در کتابخانای NET CORE پیاده سازی شده اند.
این نسخه از سی شارپ همراه با NET5. ارائه شد . نسخه 9.0 زبان پیش فرض هر اسمبلی است که دات نت 5 را پیاده سازی میکند. که شامل ویژگی های زیر است :
این نسخه ادامه نسخه های پیشین هست : حذف مرسومات ، جداسازی داده ها از الگوریتم ها و فراهم کردن الگو های بیشتر در جاهای بیشتر.
Top level statements که باعث شده که برنامه اصلی یا همان main program شما ساده تر شود. طبق رسوم گذشتگان برای نوشتن برنامه اصلی باید فضای نام ، کلاس Program و متد استاتیک Main تعریف می شد که در سی شارپ 9 نیازی به این موارد نیست.
معرفی رکوردها یک Syntax مختصر برای انواع رفرنس تایپ یا مرجع ارائه می دهد . قابلیت های تطبیق الگو به روش های مختلفی گسترش یافته است. انواع عددی اکنون از الگوهای محدوده پشتیبانی می کنند. الگوها را می توان با استفاده از and، or و not الگوها ترکیب کرد. برای خواناتر شدن الگوهای پیچیده تر می توان پرانتز اضافه کرد.
ویژگی های بیشتری برای بالا بردن کارایی سی شارپ نیز اضافه شده است :
ویژگی هایی در عملکرد Code Generator ها :
C# 9 بسیاری از ویژگی های کوچک دیگری را اضافه کرده است که بهره وری توسعه دهندگان را هم در نوشتن و هم در خواندن بهبود می بخشد:
سی شارپ 10 شامل ویژگی های اصلی زیر می باشد :
ویژگی های اضافی در حالت پیش نمایش در دسترس هستند. شما می توانید این ویژگیها را امتحان کنید و درباره آنها بازخورد ارائه دهید. ممکن است قبل از انتشار نهایی تغییر کنند. برای استفاده از این ویژگیها، باید <LangVersion> را روی Preview در پروژه خود تنظیم کنید:
سی شارپ 10 به کار روی مضامین حذف پیاده سازی های غیر ضروری، جداسازی داده ها از الگوریتم ها و بهبود عملکرد برای .NET Runtime ادامه می دهد.
بسیاری از ویژگی ها به این معنی است که کد کمتری را برای بیان مفاهیم مشابه تایپ خواهید کرد. ساختارهای رکورد بسیاری از روشهای مشابهی را که کلاسهای رکورد انجام میدهند، ترکیب میکنند. ساختارها و انواع ناشناس با expressions پشتیبانی می شوند. می توانید فضاهای نام را به صورت عمومی یا global تعریف کنید. استفاده از عبارات لامبدا راحت تر شده است . الگوهایی برای new property کد مختصرتری ایجاد میکنند.
کنترلکنندههای درونیابی رشته و رفتار AsyncMethodBuilder میتوانند عملکرد را بهبود بخشند. این ویژگی های زبان در زمان اجرا ،برای دستیابی به بهبود عملکرد در NET 6 مورد استفاده قرار خواهد گرفت.