شنبه ۲۹ خرداد ۹۵ ۱۶:۵۳ ۱۴ بازديد
سيشارپ (C#) زباني شيءگرا و سطح بالا (high level) از خانوادهٔ زبانهاي چارچوب داتنت شركت مايكروسافت است.
زبان #C، يك زبان برنامه نويسي چند الگويي است و منظم شده مدل هاي تابعي، امري، عمومي، شي گرا و جز گرا مي باشد. اين زبان توسط ماكروسافت و جزئي از دات نت به وجود آمد و بعدا استانداردهاي ECMAو ISO را نيز در بر گرفت. #C يكي از 44 زبان برنامه نويسي اي است كه توسط Common Language Runtime از .NET Framework پشتيباني مي شوند و در همه جا به وسيله Microsoft Visual Studio شناخته مي شود.
اين زبان برپايه سادگي، مدرن بودن، همه منظوره و شي گرا بودن ساخته شد.Anders Hejlsberg، طراح زبان برنامه نويسي دلفي، سرپرستي تيم طراحان زبان #C را بر عهده داشت.اين زبان داراي دستوري شي گرا مشابه ++C است و به شدت از زبان هاي جاوا و دلفي تاثير پذيرفته است.در ابتدا نام اين زبان COOL بود كه مخفف C like Object Oriented Language بود، هر چند در جولاي 2000، زماني كه ماكروسافت پروژه را عمومي اعلام كرد، اسم آن به #C تغيير پيدا كرد.آخرين نسخه آن نسخه 3 است كه از ويژوال استديو 2008 استفاده مي كند. نسخه بعدي 4 است كه در دست ساخت است.
اهداف طراحي زبان
استاندارد ECMA اين اهداف طراحي زبان را براي #C بر آورده مي سازد:
سي شارپ يك زبان برنامه سازي ساده،مدرن،براي اهداف عمومي و شي گرا است.
به دليل اهميت داشتن موضوع نيرومندي و دوام و بهره وري برنامه نويس،زبان داراي چك كننده Strong Type ، چك كننده مرزهاي آرايه، تشخيص حالتهايي كه يك متغير مقدار دهي اوليه نشدهاست،قابليت انتقال كدها و Garbage Collection خودكار است.
اين زبان براي استفاده در اجزاي توسعه نرم افزار براي دستيابي به مزاياي سيستمهاي توزيعي در نظر گرفته شدهاست.
قابليت انتقال برنامه نويس بسيار مهم است،خصوصاً براي آن دسته از برنامه نويساني كه با زبانهاي C و C++ آشنا هستند.
پشتيباني از اين زبان براي بين المللي شدن بسيار مهم است.
زبان سي شارپ براي نوشتن برنامهها براي سيستمهاي تعبيه شده و ميزبان در نظر گرفته شدهاست، از سيستم عامل هاي پيچيده بسيار بزرگ گرفه تا توابع اختصاصي بسيار كوچك.
هر چند برنامه هاي نوشته شده با #C طوري هستند كه از لحاظ حافظه و پردازنده مورد نياز مقرون به صرفه باشند، ولي خود زبان از لحاظ اندازه و كارايي به خوبي زبان هاي C و اسمبلي نيست.
تاريخچه
در سال 1999، شركت سان اجازه استفاده از زبان برنامه نويسي جاوا را در اختيار ماكروسافت قرار داد تا در سيستم عامل خود از آن استفاده كند.جاوا در اصل به هيچ پلت فرم يا سيستم عاملي وابسته نبود، ولي ماكروسافت برخي از مفاد قرار داد را زير پا گذاشت و قابليت مستقل از سيستم عامل بودن جاوا را از آن برداشت.شركت سان پرونده اي عليه ماكروسافت درست كرد و ماكروسافت مجبور شد تا زبان شي گراي جديدي با كامپايل جديد كه به ++C شبيه بود را درست كند. در طول ساخت دات نت، كلاس هاي كتابخانه اي با زبان و كامپايلر SMC نوشته شدند.در سال 1999 آندرس هلزبرگ گروهي را براي طراحي زباني جديد تشكيل داد كه در آن زمان نامش Cool بود و همانند C بود با خواص شي گرايي. ماكروسافت در نظر داشت اسم اين زبان را تا آخر Cool قرار دهد، ولي به دليل مناسب نبودن براي اهداف تجاري اين كار را نكرد. در ارائه و معرفي رسمي .NET در PDC در سال 2000 اين زبان به Cسي شارپ تغيير نام يافت و كتابخانه كلاس ها و runtime در ASP.NET به#C منتقل شدند. مدير و سرپرست طراحان در ماكروسافت آندرس هلزبرگ بود كه تجربه قبلي او در طراحي Framework و زبانهاي برنامه سازي++Borland , Delphi, Turbo Pascal, Visual C به آساني در دستورالعملهاي سي شارپ قابل رويت است و به همان خوبي در هسته CLR.
ويژگيها
برخي از تفاوتهاي زبان سي شارپ با C و ++C عبارتند از:
هيچ تابع يا متغير سراسري(Global) وجود ندارد، تمام متدها و اعضا بايستي در داخل كلاسها تعريف شوند.اين امر ممكن است، هر چند براي استفاده از متغير ها و توابع عمومي بايد از متدها و متغيرها در كلاس هاي عمومي استفاده كرد.
متغير هاي عمومي، بر خلاف C و ++C ، نمي توانند بلاك هاي پيوستي را در بر بگيرند.
سي شارپ داراي يك نوع داده بولي است (bool).برخي از عبارتها مانند while و if كه شرطي هستند، نيازمند يك عبارت نوع بولي هستند.همان طور كه ++C نيز داراي نوع داده بولي است،اين نوع داده به راحتي ميتواند به يا از Integerها تبديل شود، و عبارتي مانند (if(a نيازمند اين امر است كه a از يك نوع قابل تبديل به bool يا اشاره گر باشد.كامپايلر سي شارپ برنامه نويس را در اين شرايط مجبور به استفاده از عباراتي ميكند كه به درستي يك مقدار bool را برميگردانند. بنابراين دستوري مانند (if(a = b باعث بروز خطا ميشوند.(به جاي = بايستي از == استفاده شود)
در سي شارپ ، اشاره گرهاي به حافظه بايستي فقط در داخل بلوكهاي unsafe استفاده شوند و برنامه در اين حالت براي اجرا نياز به اجازه از كاربر دارد.بيشتر دسترسي شي از طريق شي امن است كه يا هميشه در حال اشاره به شي صحيح موجود است يا يك مقدار Null دارد. اشاره گري به شي به درد نخور يا بلاك حافظه رندم غير ممكن است.اشاره گر نا امن مي تواند به نمونه اي از value-type ، آرايه، رشته يا بلاكي كه حافظه به آن داده شده است اشاره نمايد.كدي كه به عنوان نا امن علامت نخورده باشد، هنوز مي تواند اشاره گر ها را از سيستم بازيابي يا در آن ذخيره كند ولي نمي تواند مرجع جديدي به آنها اختصاص دهد.
حافظه ساماندهي شده نمي تواند صريحا آزاد شود، ولي به طور خودكار به عنوان به درد نخور تلقي مي شود.انتخاب آدرس هاي به درد نخور حافظه نفوذ ناپذير است. هم چنين #C با استفاده از عبارات، پشتيباني مستقيمي از پايان اجباري مي كند(پشتيباني از اصطلاح Resource Acquisition Is Initialization).
وراثت چندگانه از كلاسها در اين زبان پشتيباني نميشود.البته يك كلاس امكان ارث بري از تعداد نامحدود واسطها را دارد.پشتيباني نكردن از وراثت چندگانه به دليل اهداف معماري اين زبان در CLI و براي جلوگيري از پيچيدگي است.
سي شارپ بسيار typesafe تر از C++ است. تنها تبديلات ضمني مثل تبديل نوع داده كوچكتر به بزرگتر يا تبديل نوع مشتق شده به نوع پايه به طور پيش فرض و بدون خطا صورت ميپذيرد.هيچ تبديل ضمني اي ميانBooleanها و Integerها وجود ندارد و هر تبديل user-defined بايستي به صراحت با يكي از كلمات explicit يا implicit نشانه گذاري شود. تبديل b به a در حالتي كه a يك Integer و b يك double باشد در زبان C++ مجاز است اما در سي شارپ به يك خطاي زمان كامپايل منجر ميشود(بايستي به صورت explicit تعريف شود)
اعضاي Enumeration در داخل محدوده شخصي خود قرار دارند.
#C قابليت syntactic sugar را براي توابع متداول، اكسسور ها و ماجول هاي كسول شده در يك كلاس به صورت ويژگي ها قرار داده است.
اكسسورها كه خاصيت نيز گفته ميشوند در زبان سي شارپ قادر به كنترل دسترسي اعضا و معتبرسازي دادهها هستند.
تمام انواع بازتابي(Reflection) و بازيابي(Recovery) قابل استفادهاست.
در حال حاظر (3 جوان 2008) داراي 77 كلمه رزرو شده است.
سيستم يكپارچه شده
سي شارپ داراي يك سيستم نوع يكپارچهاست كه به آن CTS مي گويند.اين بدان معناست كه تمام انواع،شامل موارد اصلي مانند Integerها، مشتق شده از System.Object هستند.به عنوان مثال، هر نوع يك متد به نام ToString() را به ارث ميبرد.بخاطر كارائي،انواع اوليه (و انواع مقداري) به طور داخلي فضايي براي آنها بر روي پشته در نظر گرفته ميشود.
انواع داده
CTS داده ها را به دو نوع تقسيم مي كند:
نوع مقداري
نوع مرجعي
انواع داده اي توده ساده اي از داده مي باشند.نمونه هاي انواع داده اي نه حويت مرجعي دارند و نه مفاهيم مقايسه مراجع را. براي مقايسه برابري يا عدم برابري انواع داده اي، خود مقدار داده ها را با يكديگر مقايسه مي كنيم مگر اينكه عملگر هاي مشابه دوباره تعريف شده باشند.مقادير داده هاي مرجعي هميشه يك مقدار پيش فرض دارند و هميشه مي توانند ايجاد و يا كپي شوند.يكي ديگر از محدوديت هاي انواع داده اي اين ات كه آنها نمي توانند از يكديگر مشتق شوند(ولي ميتوانند اشتراكاتي داشته باشند) و هم چنين نمي توانند در سازنده مقدار دهي اوليه شوند. مثالي از انواع داده اي، بعضي از انواع اوليه مانند int و float و char و System.DateTime مي باشند. در مقابل، انواع مرجعي مفهوم تعريف مرجعي را دارند( كه در آن هر نمونه از نوع مرجع، به طور ذاتي از ديگر نمونه ها جدا مي شود، حتي اگر داده هر دو نمونه يكي باشد). اين دقيقا نمونه مشابه مقايسه تساوي يا عدم تساوي داده هاي مرجعي است، كه در آن آزمايش براي مرجع ها از داده اي ها سريع تر است. در كل نه هميشه امكان تعريف نمونه مرجعي وجود دارد و نه امكان كپي يا نمايش مقادير مقايسه دو نمونه.ولي به هر حال انواع مرجعي خاص مي توانند اين اعمال را از طريق سازنده هاي عمومي يا اجراي واسط هاي مشابه(مثل ICloneable يا IComparable) انجام دهند.نمونه هايي از انواع مرجعي، اشيا، System.Stringو Sysmet.Array مي باشند. هر دو نوع داده قابليت انعطاف توسط تعريف به وسيله كاربر را دارند.
Boxing و EnBoxing
Boxing
عمل تبديل مقدار نوع داده اي به نوع مرجع مشابه آن مي باشد.
مثال:
int foo = 42; // Value type...
object bar = foo; // foo is boxed to bar.
UnBoxing
عمل تبديل نوع مرجع به نوع داده اي مي باشد. مثال:
int foo = 42; // Value type.
object bar = foo; // foo is boxed to bar.
int foo2 = (int)bar; // Unboxed back to value type.
سي شارپ به برنامه نويس با استفاده از كلمه كليدي Struct اجازه ميدهد تا انواع مقداري User-defined را ايجاد كند. از ديدگاه برنامه نويسي، آنها كلاسهاي سبك وزن به نظر ميرسند. برخلاف كلاسها (كه بر روي heap قرار ميگيرند) و شبيه به انواع اوليه استاندارد مانند انواع مقداري Structها نيز بر روي پشته قرار ميگيرند.آنها همچنين ميتوانند قسمتي از يك شئ باشند، يا در يك آرايه مرتب شوند، بدون حافظه غير مستقيمي كه به طور معمول براي انواع كلاس تخصيص مييابد.
ويژگيهاي جديد در C# 2.0
ويژگيهاي جديد در C# .NET SDK 2.0 (مطابق با سومين ويرايش استاندارد ECMA-334):
كلاسهاي partial
كلاسهاي Partial اجازه اجراي كلاسها از بيش از يك سورس فايل را ميدهند.اين امر اجازه ميدهد تا كلاسهاي بسيار بزرگ را قطعه قطعه كنيم و همچنين براي زماني كه برخي قسمتهاي يك كلاس به طور خودكار توليد ميشوند مفيد است.
file1.cs:
public partial class MyClass
{
public MyClass()
{
// implementation
}
}
file2.cs:
public partial class MyClass
{
public void SomeMethod()
{
// implementation
}
}
Genericها
genericها يا نوع هاي پارامتري شده يا چندريختي هاي پارامتري يك ويژگي جديد .NET 2.0 است كه به وسيله سي شارپ پشتيباني ميشود.برخلاف Templateهاي سي پلاس پلاس،در اين انواع به جاي اينكه نمونه سازي توسط كامپايلر انجام شود، در زمان اجرا صورت ميگيرد، بنابراين مي توانند چند زبلنه باشند در حالي كه ++C نمي تواند.آنها داراي ويژگيهايي هستند كه به طور مستقيم توسطTemplateهاي C++ پشتيباني نميشوند مانند نوع محدوديتها در پارامترهاي Generic با استفاده از رابط ها(Interface). سي شارپ از پارامترهايهاي Generic بدون نوع پشتيباني نميكند.بر خلاف genericهاي جاوا،genericهاي دات نت براي پارامتري كردن انواع داده اي در اشيا ماشين مجازي CLI، از مفاهيم شي گرايي استفاده مي كنند كه اجازه بهينه سازي و حفاظت انواع اطلاعات را مي دهد.
كلاس هاي static
كلاسها به صورت Static قابل تعريف نيستند مگر اينكه تمام اعضاي آنها Static باشند.كه اين امر بسيار شبيه به مفهوم مدل در زبانهاي رويهاي است.(زبان رويهاي : يك زبان برنامه نويسي كه در آن عنصر اصلي برنامه نويسي يك زيربرنامهاست.مانند زبانهاي C، پاسكال و...)
يك شكل جديد از تكرار كننده با استفاده از سازنده توابع
يك شكل جديد از iterator(تكرار كننده) ، با استفاده از ساختار yield return بسيار شبيه به yield زبان Python.
// Method that takes an iterable input (possibly an array) and returns all even numbers.
public static IEnumerable GetEven(IEnumerable numbers)
{
foreach (int i in numbers)
{
if (i % 2 == 0) yield return i;
}
}
Delegateهاي ناشناس
Delegateهاي ناشناس كه عملكردهاي محدودي را در #C به وجود ميآورند.كد كنار بدنه Deletage ناشناس، دسترسي كامل براي خواندن يا نوشتن در متغيرهاي عمومي، پارامترهاي توابع و اعضاي كلاسهاي داراي محدوده Deletage را دارد ولي پارامترهاي out و ref را پشتيباني نمي كند.
براي مثال :
int SumOfArrayElements(int[] array)
{
int sum = 0;
Array.ForEach(
array,
delegate(int x)
{
sum += x;
}
);
return sum;
}
Delegate covariance and contravariance
تبديل گروه هاي متد به نوع Deletage در برگشت داراي covariant و در انواع پارامترها داراي contravariant هستند.
اكسسورهاي يك خاصيت(get و set) ميتوانند داراي سطح دسترسي متفاوتي باشند.
مثال :
string status = string.Empty;
public string Status
{
get { return status; } // anyone can get value of this property,
protected set { status = value; } // but only derived classes can change it
}
نكته مهم : سطح دسترسي خاصيت نميتواند بالاتر از سطح دسترسي اكسسورها باشد.به عنوان مثال private بودن خاصيت و public بودن اكسسور باعث بروز خطا ميشود.