[h=2][/h] سيشارپ در اين تاپيک قصد دارم اطلاعاتي کامل درباره زبان برنامه نويسي سي شارپ را قرار بدهم.. اميدوارم که بدردتون بخوره. البته خودمم زياد اين زبان را بلد نيستم ولي علاقه دارم..... خب ديگه شروع کنيم...... سيشارپ (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 است که در دست ساخت است. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) اهداف طراحي زبان استاندارد ECMA اين اهداف طراحي زبان را براي #C بر آورده مي سازد: سي شارپ يک زبان برنامه سازي ساده،مدرن،براي اهداف عمومي و شي گرا است. به دليل اهميت داشتن موضوع نيرومندي و دوام و بهره وري برنامه نويس،زبان داراي چک کننده Strong Type ، چک کننده مرزهاي آرايه، تشخيص حالتهايي که يک متغير مقدار دهي اوليه نشدهاست،قابليت انتقال کدها و Garbage Collection خودکار است. اين زبان براي استفاده در اجزاي توسعه نرم افزار براي دستيابي به مزاياي سيستمهاي توزيعي در نظر گرفته شدهاست. قابليت انتقال برنامه نويس بسيار مهم است،خصوصاً براي آن دسته از برنامه نويساني که با زبانهاي C و 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. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) ويژگيها برخي از تفاوتهاي زبان سي شارپ با 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 کلمه رزرو شده است. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) سيستم يکپارچه شده سي شارپ داراي يک سيستم نوع يکپارچهاست که به آن 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 عمل تبديل نوع مرجع به نوع داده اي مي باشد. مثال: کد HTML: کد: 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ها نيز بر روي پشته قرار ميگيرند.آنها همچنين ميتوانند قسمتي از يک شئ باشند، يا در يک آرايه مرتب شوند، بدون حافظه غير مستقيمي که به طور معمول براي انواع کلاس تخصيص مييابد. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) ويژگيهاي جديد در C# 2.0 ويژگيهاي جديد در C# .NET SDK 2.0 (مطابق با سومين ويرايش استاندارد ECMA-334): کلاسهاي partial کلاسهاي Partial اجازه اجراي کلاسها از بيش از يک سورس فايل را ميدهند.اين امر اجازه ميدهد تا کلاسهاي بسيار بزرگ را قطعه قطعه کنيم و همچنين براي زماني که برخي قسمتهاي يک کلاس به طور خودکار توليد ميشوند مفيد است. file1.cs: کد HTML: کد: public partial class MyClass } public MyClass() } // implementation { file2.cs: کد: public partial class MyClass } ()public void SomeMethod } // implementation { { گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) Genericها genericها يا نوع هاي پارامتري شده يا چندريختي هاي پارامتري يک ويژگي جديد .NET 2.0 است که به وسيله سي شارپ پشتيباني ميشود.برخلاف Templateهاي سي پلاس پلاس،در اين انواع به جاي اينکه نمونه سازي توسط کامپايلر انجام شود، در زمان اجرا صورت ميگيرد، بنابراين مي توانند چند زبلنه باشند در حالي که ++C نمي تواند.آنها داراي ويژگيهايي هستند که به طور مستقيم توسطTemplateهاي C++ پشتيباني نميشوند مانند نوع محدوديتها در پارامترهاي Generic با استفاده از رابط ها(Interface). سي شارپ از پارامترهايهاي Generic بدون نوع پشتيباني نميکند.بر خلاف genericهاي جاوا،genericهاي دات نت براي پارامتري کردن انواع داده اي در اشيا ماشين مجازي CLI، از مفاهيم شي گرايي استفاده مي کنند که اجازه بهينه سازي و حفاظت انواع اطلاعات را مي دهد. کلاس هاي static کلاسها به صورت Static قابل تعريف نيستند مگر اينکه تمام اعضاي آنها Static باشند.که اين امر بسيار شبيه به مفهوم مدل در زبانهاي رويهاي است.(زبان رويهاي : يک زبان برنامه نويسي که در آن عنصر اصلي برنامه نويسي يک زيربرنامهاست.مانند زبانهاي C، پاسکال و...) گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) يک شکل جديد از تکرار کننده با استفاده از سازنده توابع يک شکل جديد از iterator(تکرار کننده) ، با استفاده از ساختار yield return بسيار شبيه به yield زبان Python کد: // Method that takes an iterable input (possibly an array) and returns all even numbers. public static IEnumerable<int> GetEven(IEnumerable<int> numbers)) } foreach (int i in numbers) } if (i % 2 == 0) yield return i; { { گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) Delegateهاي ناشناس Delegateهاي ناشناس که عملکردهاي محدودي را در #C به وجود ميآورند.کد کنار بدنه Deletage ناشناس، دسترسي کامل براي خواندن يا نوشتن در متغيرهاي عمومي، پارامترهاي توابع و اعضاي کلاسهاي داراي محدوده Deletage را دارد ولي پارامترهاي out و ref را پشتيباني نمي کند. براي مثال : کد: int SumOfArrayElements(int[] array) { int sum =0; Array.ForEach( array, delegate(int x) { sum += x; } ); return sum; } گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) [h=2][/h] 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 بودن اکسسور باعث بروز خطا ميشود. گردآورنده: طه - Borna66