PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)



Borna66
01-05-2010, 01:38 PM
سي‌شارپ



در اين تاپيک قصد دارم اطلاعاتي کامل درباره زبان برنامه نويسي سي شارپ را قرار بدهم..

اميدوارم که بدردتون بخوره.
البته خودمم زياد اين زبان را بلد نيستم ولي علاقه دارم.....

خواب ديگه شروع کنيم......


سي‌شارپ (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

Borna66
01-05-2010, 01:39 PM
اهداف طراحي زبان


استاندارد ECMA اين اهداف طراحي زبان را براي #C بر آورده مي سازد:
سي شارپ يک زبان برنامه سازي ساده،مدرن،براي اهداف عمومي و شي گرا است.
به دليل اهميت داشتن موضوع نيرومندي و دوام و بهره وري برنامه نويس،زبان داراي چک کننده Strong Type ، چک کننده مرزهاي آرايه، تشخيص حالتهايي که يک متغير مقدار دهي اوليه نشده‌است،قابليت انتقال کدها و Garbage Collection خودکار است.
اين زبان براي استفاده در اجزاي توسعه نرم افزار براي دستيابي به مزاياي سيستم‌هاي توزيعي در نظر گرفته شده‌است.
قابليت انتقال برنامه نويس بسيار مهم است،خصوصاً براي آن دسته از برنامه نويساني که با زبان‌هاي C و C++ آشنا هستند.
پشتيباني از اين زبان براي بين المللي شدن بسيار مهم است.
زبان سي شارپ براي نوشتن برنامه‌ها براي سيستمهاي تعبيه شده و ميزبان در نظر گرفته شده‌است، از سيستم عامل هاي پيچيده بسيار بزرگ گرفه تا توابع اختصاصي بسيار کوچک.
هر چند برنامه هاي نوشته شده با #C طوري هستند که از لحاظ حافظه و پردازنده مورد نياز مقرون به صرفه باشند، ولي خود زبان از لحاظ اندازه و کارايي به خوبي زبان هاي C و اسمبلي نيست.

Borna66
01-05-2010, 01:40 PM
تاريخچه

در سال 1999، شرکت سان اجازه استفاده از زبان برنامه نويسي جاوا را در اختيار ماکروسافت قرار داد تا در سيستم عامل خود از آن استفاده کند.جاوا در اصل به هيچ پلت فرم يا سيستم عاملي وابسته نبود، ولي ماکروسافت برخي از مفاد قرار داد را زير پا گذاشت و قابليت مستقل از سيستم عامل بودن جاوا را از آن برداشت.شرکت سان پرونده اي عليه ماکروسافت درست کرد و ماکروسافت مجبور شد تا زبان شي گراي جديدي با کامپايل جديد که به ++C شبيه بود را درست کند. در طول ساخت دات نت، کلاس هاي کتابخانه اي با زبان و کامپايلر SMC نوشته شدند.در سال 1999 آندرس هلزبرگ گروهي را براي طراحي زباني جديد تشکيل داد که در آن زمان نامش Cool بود و همانند C بود با خواص شي گرايي. ماکروسافت در نظر داشت اسم اين زبان را تا آخر Cool قرار دهد، ولي به دليل مناسب نبودن براي اهداف تجاري اين کار را نکرد. در ارائه و معرفي رسمي .NET در PDC در سال 2000 اين زبان به Cسي شارپ تغيير نام يافت و کتابخانه کلاس ها و runtime در ASP.NET به#C منتقل شدند. مدير و سرپرست طراحان در ماکروسافت آندرس هلزبرگ بود که تجربه قبلي او در طراحي Framework و زبان‌هاي برنامه سازي++Borland , Delphi, Turbo Pascal, Visual C به آساني در دستورالعمل‌هاي سي شارپ قابل رويت است و به همان خوبي در هسته CLR.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 01:43 PM
ويژگي‌ها

برخي از تفاوت‌هاي زبان سي شارپ با 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

Borna66
01-05-2010, 01:44 PM
سيستم يکپارچه شده

سي شارپ داراي يک سيستم نوع يکپارچه‌است که به آن 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

Borna66
01-05-2010, 01:48 PM
ويژگي‌هاي جديد در 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

Borna66
01-05-2010, 01:53 PM
Generic‌ها

genericها يا نوع هاي پارامتري شده يا چندريختي هاي پارامتري يک ويژگي جديد .NET 2.0 است که به وسيله سي شارپ پشتيباني مي‌شود.برخلاف Template‌هاي سي پلاس پلاس،در اين انواع به جاي اينکه نمونه سازي توسط کامپايلر انجام شود، در زمان اجرا صورت مي‌گيرد، بنابراين مي توانند چند زبلنه باشند در حالي که ++C نمي تواند.آنها داراي ويژگي‌هايي هستند که به طور مستقيم توسطTemplate‌هاي C++ پشتيباني نمي‌شوند مانند نوع محدوديت‌ها در پارامترهاي Generic با استفاده از رابط ها(Interface). سي شارپ از پارامترهاي‌هاي Generic بدون نوع پشتيباني نمي‌کند.بر خلاف genericهاي جاوا،genericهاي دات نت براي پارامتري کردن انواع داده اي در اشيا ماشين مجازي CLI، از مفاهيم شي گرايي استفاده مي کنند که اجازه بهينه سازي و حفاظت انواع اطلاعات را مي دهد.


کلاس هاي static

کلاس‌ها به صورت Static قابل تعريف نيستند مگر اينکه تمام اعضاي آنها Static باشند.که اين امر بسيار شبيه به مفهوم مدل در زبانهاي رويه‌اي است.(زبان رويه‌اي : يک زبان برنامه نويسي که در آن عنصر اصلي برنامه نويسي يک زيربرنامه‌است.مانند زبانهاي C، پاسکال و...)

گردآورنده: طه - Borna66

Borna66
01-05-2010, 01:54 PM
يک شکل جديد از تکرار کننده با استفاده از سازنده توابع

يک شکل جديد از 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

Borna66
01-05-2010, 01:56 PM
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

Borna66
01-05-2010, 01:57 PM
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

Borna66
01-05-2010, 01:59 PM
نوع داده Nullable

نوع داده Nullable (که با يک علامت سوال قابل تشخيص است : int? i = null;)اجازه تخصيص مقدار null را براي انواع داده‌اي مي‌دهد.اين امر باعث بهبودي فعل و انفعال با پايگاه داده SQL مي‌شود. در اين حالت نوع ستوني INTEGER NULL در SQL به طور مستقيم به int? در سي شارپ تبديل مي‌شود.

داده هاي Nullable در آخرين لحظات آگوست 2005 اضافه شدند چند هفته متنده به اتمام کار اداري و براي بهبود زبان.متغير Null در حقيقت خالي نيست، بلکه نمونه اي است از struct Nullable<T> با ويژگي HasValue مساوي false. وقتي در برنامه قرار مي گيرد، خود به خود نمونه خالي در آن قرار مي گيرد، نه مقدار خود آن، در نتيجه اشاره گر مقصد هميشه غير Null مي باشد، حتي براي مقادير Null. کد زير نضص بالا را مشخص مي کند:





int? i = null;
object o = i;
if (o == null)
Console.WriteLine(«Correct behaviour - runtime version from September 2005 or later»);
else
Console.WriteLine(«Incorrect behaviour - pre-release runtime (from before September 2005)»);


وقتي درون شي اي کپي مي شود، نمونه Nullable به صورت تشريفاتي در آن قرار مي گيرد و در نتيجه مقادير و منابع Null با هم برابر مي شوند.در گذشته اين خاصيت داراي مجادله بود تا زماني که علاوه بر .NET2 ، به هسته CLR نيز مجهز شد و همه تکنولوژي ها نظير #CوVBوSQL Server 2005و Visual Studio 2005 را شامل شد.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:01 PM
Coalesce Operator

مقدار اولين عملوندي که null نباشد را برمي گرداند.(يا null،براي زماني که تمام عملوندها null باشند)





object nullObj = null;
object obj = new Object();
return nullObj ?? obj; // returns obj


کاربرد اصلي اين عملگر در قرار دادن يک مقدار nullable در يک مقدار non-nullable با استفاده از يک دستورالعمل ساده‌است.




int? i = null;
int j = i ?? 0; /* Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.*/
گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:05 PM
ويژگي‌هاي جديد در C# 3.0

اين ورژن در تاريخ 19 نوامبر سال 2007 به عنوان بخشي از .NET Framework 3.5 عرضه شد.که شامل ويژگي‌هاي جديد الهام شده از زبان‌هاي برنامه نويسي اصلي(Functional) مانند Haskell و ML، و الگوي LINQ براي CLR است.در حال حاظر توسط هيچ موسسه استاندارد سازي اي تائيد نشده است.




معرفي (Language-Integrated Query(LINQ

LINQ، يک زبان پرس و جوي قابل انعطاف و همه منظورهبراي بسياري از انواع منبع داده هااست( مثل انتخاب اشيا شناور، سند هاي XML، بانک هاي اطلاعاتي و . . .) که در ويژگي هاي 3#C جمع شده اند. سينتکس زبان به زحمت از SQL گرفته شده است، براي مثال:


int[] array = { 1, 5, 2, 10, 7 };

// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
where x % 2 == 1
orderby x descending
select x * x;

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:06 PM
.wysiwyg { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #fafafa; PADDING-BOTTOM: 0px; MARGIN: 5px 10px 10px; FONT: 10pt/22px Tahoma; COLOR: #000000; PADDING-TOP: 0px } .wysiwyg A:link { COLOR: #23305a; TEXT-DECORATION: none } .wysiwyg_alink { COLOR: #23305a; TEXT-DECORATION: none } .wysiwyg A:visited { COLOR: #23305a; TEXT-DECORATION: none } .wysiwyg_avisited { COLOR: #23305a; TEXT-DECORATION: none } .wysiwyg A:hover { COLOR: #ff3366; TEXT-DECORATION: none } .wysiwyg A:active { COLOR: #ff3366; TEXT-DECORATION: none } .wysiwyg_ahover { COLOR: #ff3366; TEXT-DECORATION: none } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } مقدار دهي به اشيا

کد HTML:

Customer c = new Customer(); c.Name = "James";
عبارت بالا مي تواند به صورت زير نوشته شود:

کد HTML:

Customer c = new Customer { Name="James" };


گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:08 PM
مقدار دهي Collection





MyList list = new MyList();
list.Add(1);
list.Add(2);


عبارت بالا مي تواند به صورت زير نوشته شود:

کد HTML:

MyList list = new MyList { 1, 2 }; فرض کنيد که اجزاي MyList و System.Collections.IEnumerable داراي متد عمومي Add هستند.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:36 PM
انواع داده اي بي نام

کد HTML:


کد:

var x = new { FirstName="James", LastName="Frank" };
C# 2.0توابع بي نام را معرفي کرد. C# 3.0هم انواع بي نام را معرفي مي کند.با استفاده از اين ويژگي برنامه نويسان قادر خواهند بود به صورت Inline انواع دلخواه خود را ايجاد کنند.به نمونه زير توجه کنيد:

کد HTML:



کد:

static void Main(string[] args)
{
var anonymousType = new { Name = string.Empty, Age = 0 };
}

کد ارائه شده، يک نوع بي نام را تعريف مي کند که از طريق متغير ضمني محلي به نام anonymousType در اختيار قرار مي گيرد.

چرا Anonymous types؟ انواع بي نام بهترين گزينه براي توليد Entity Typeها مي باشند.همانطور که گفته شد Entity Typeها فقط حاوي داده‌ها هستند.بنابراين به بهترين نحو مي توان داده هاي دريافت شده از کاربر را در انواع بي نام بسته بندي کرد.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:37 PM
نتيجه نوع متغير محلي


کد HTML:




var x = new Dictionary<string, List<float>>();

کد بالا با کد زير قابل تعويض مي باشد:

کد HTML:



Dictionary<string, List<float>> x = new Dictionary<string, List<float>>();
اين ويژگي تنها يک ntactic sugarراحت براي کوتاه تر بيان کردن متغيرهاي محلي نمي باشد، بلکه براي تعريف متغير هاي بي نام لازم نيز است.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:39 PM
عبارات لامبدا :

عبارات لامبدا يک راه کوتاه براي نوشتن مقادير توابع بي نام کلاس اول را فراهم مي کنند. دو مثال زير را در نظر بگيريد:




listOfFoo.Where(delegate(Foo x) { return x.Size > 10; })
listOfFoo.Where(x => x.Size > 10);



در مثال هاي فوق، عبارات لامبدا صرفا يک نوع سينتکس براي delegateهاي بي نام با مقادير داراي بازگشت هستند.هر چند با توجه به نوع متن استفاده مي شوند، کامپايلر #C مي تواند لامبدا ها را به ASTها نيز تبديل کند تا بعدا در زمان اجرا نيز بتوانند پردازش شوند.در مثال فوق، اگر listOfFoo يک مجموعه ساده داخل حافظه نباشد، ولي يک پوشه در اطراف جدول بانک اطلاعاتي مي باشد. اين تکنيک مي تواند براي بهينه کردن اجرا، براي ترجمه بدنه لامبدا به عبارت معادل آن در SQL استفاده شود.در هر يک از دو راه فوق، خود عبارت لامبدا دقيقا شبيه کد به نظر مي رسد، بنابراين روش استفاده در زمان اجرا، براي کاربر ناپيدا مي باشد.

يکي از ويژگي هايي کهC# 2.0 ارائه کرد، توانايي تعريف توابع به صورت Inline بود که اين ويژگي با عنوان توابع بي نام (anonymous methods) شناخته مي شود. توابع بي نام در پاره اي مواقع بسيار مفيدند. اما نحو(syntax) به کارگيري آنها دشوار مي باشد. عبارات لامبدا ويژگي توابع بي نام را دارند اما با نحو ساده تري در C# 3.0معرفي شده‌اند.به نمونه زير توجه کنيد:




static void Main(string[] args)
{
(int x) => x + 1; // explicitly typed parameter
(y, z) => y * z; // implicitly typed parameter
}



تعريف عبارات لامبدا از نحو (syntax) خاصي پيرو مي کند. همانطور که در کد بالا مشاهده مي کنيد، پارامترهاي تابع هم به صورت صريح و هم به صورت ضمني قابل بيان اند. کلمه return به صورت ضمني حذف شده‌است. تابع معادل عبارت لامبداي اول به صورت زير است:




کد HTML:

int Fn(int x)
{
return x+1;
}

ليست پارامترها و بدنه عبارت لامبدا توسط => از هم جدا مي شوند. در صورتي که تعريف عبارت لامبدا بيشتر از يک خط کد باشد مي توان بدنه آن را با استفاده از {} نشان داد.

کد HTML:



static void Main(string[] args)
{
(int x) => { x + 1; return x * x; };
}


گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:40 PM
خواص خودکار

کامپايلر به طور خودکار يک متغير نمونه خصوصي و قرار دهنده و قرار گيرنده مناسب توليد مي کند، مانند :





public string Name { get; private set; }



توابع بسط داده شده

توابع بسط داده شده حالتي از سينتکس Suger هستند که امکان اضافه کردن متد جديد به کلاس موجود را بيرون از حوزه تعريف آن فراهم مي کنند.در اين مثال، تابع بسط داده شده يک تابع ايستا است که قابل فراخواني توسط تابع مشابه مي باشد.گيرنده فراخواني مقيد به اولين پارامتر تابع تحت عنوان this مي باشد:

کد HTML:



public static class StringExtensions
{
public static string Left(this string s, int n)
{
return s.Substring(0, n);
}
}

string s = "foo";
s.Left(3); // same as StringExtensions.Left(s, 3);

زبان سي شارپ کلمه کليدي sealed را براي اين منظور ارائه کرد که امکان ارث بري از يک کلاس را صلب کند. يعني با اضافه شدن اين کلمه کليدي به ابتداي تعريف کلاس، امکان ارث بري از آن غير ممکن مي شود. C# 3.0 ويژگي جديدي را در اختيار برنامه نويسان قرار مي دهد به اين صورت که مي توان هر نوع کلاسي حتي کلاس هاي مهر شده با Sealed را با استفاده از Extension methodsبسط داد

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:41 PM
توابع جزئي

توابع جزئي به توليد کننده هاي کد اجازه توليد اعلان توابع به صورت نقاط گسترش يافته اي که تنها شامل کدهاي اصلي هستند را مي دهد، در صورتي که يک نفر آن را در قسمتي از کلاسي ديگر اجرا کند.

متغيرهاي ضمني محلي :
C# 3.0 کلمه کليدي جديد var را معرفي مي کند که به کمک آن برنامه نويسان قادر خواهند بود متغيرهاي محلي خود را بدون ذکر صريح نوع آن‌ها، تعريف کنند.

کد HTML:



namespace CS3_Test
{
class Program
{
static void Main(string[] args)
{
var string_value = «Hello C# 3.0»;
var int_value = 3;
}
}
{

يکي از ويژگي هاي اصلي زبان سي شارپ،Strong Type بودن آن است. Strong Type بودن زبان به اين معناست که با اعلان يک متغير، نوع آن صريحا بايد توسط برنامه نويس مشخص شود. آيا اضافه شدن اين ويژگي جديد، منافاتي با Strong Type بودن اين زبان دارد؟در پاسخ بايد گفت که تعريف متغيرهاي محلي به صورت ضمني با استفاده از کلمه کليدي var هيچ گونه منافاتي با Strong Type بودن سي شارپ ندارد. چون برنامه نويس مي بايست نوع متغير را به هنگام اعلان آن صريحا مشخص کند.نوع متغير پس از اولين اعلان تا اتمام حوزه تعريف آن تغيير نخواهد کرد و هر گونه تلاش براي تغيير نوع با خطا مواجه خواهد شد.بنابراين دو اعلان زير نامعبر هستند:

کد HTML:


namespace CS3_Test
{
class Program
{
static void Main(string[] args)
{
var string_value; // Error : Implicitly typed locals must be inintialized
var int_value = null; /* Error : Cannot assign '<null>' to an implicitly typed local */
}
}
}


استفاده از var تنها در تعريف متغيرهاي محلي امکانپذير است. در اعلان متغيرها به صورت سراسري، پارامترهاي توابع و مقادير بازگشتي نمي توان از var استفاده کرد. چرا var ؟ اين ويژگي آزادي عملي بيشتري براي کار با متغيرهاي محلي در اختيار برنامه نويس قرار مي دهد. سناريويي را در نظر بيگيريد که يک تابع تحت شرايطي، مقادير از انواع مختلف را برگرداند. در اين صورت بدون درگير شدن با casting و تبديل نوع مي توان با تعريف متغير ضمني محلي هر نوعي را که تابع برمي گرداند، در اختيار داشت.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 02:44 PM
سازنده‌هاي پيشرفته :

ماهيت تمامي برنامه هاي امروزي به گونه اي ست که با حجم عظيمي از داده‌ها سرو کار دارند.براي مديريت داده‌ها، نياز به کلاس هايي ست که در مهندسي نرم افزار آنها را Entity Types مي ناميم.اين کلاس‌ها به عنوان بسته هايي از داده‌ها محسوب مي شوند.معضل فعلي موجود در رابطه با Entity Typeها تعدد سازنده هاي آن‌ها مي باشد و ممکن است شما نيز با اين مشکل برخورد کرده باشيد.به اين صورت که در سناريوهاي مختلف، برنامه نويسان مجبور هستند سازنده يک کلاس را به چند شکل سربارگذاري کنند.C# 3.0 راه چاره اي فوق العاده براي اين مشکل ارائه مي دهد. Object initializer حالت پيشرفته اي از سازنده مي باشد.

کد HTML:



class Person
{
private string firstname;

public string FirstName
{
get { return firstname; }
set { firstname = value; }
}

private string lastname;

public string LastName
{
get { return lastname; }
set { lastname = value; }
}

private int age;

public int Age
{
get { return age; }
set { age = value; }
}
}



اين کلاس شامل سه متغير بوده و براي هر متغير خاصيتي تعريف شده‌است.اينک اين سوالات مطرح مي شوند : سازنده اين کلاس را به چند شکل بايد سربارگذاري کرد؟ سازنده اي که هر سه متغير را مقداردهي کند؟ شايد در مواردي هر سه متغير در دست نباشد در اين صورت چه سازنده اي بايد فراخواني شود؟ C# 3.0 راه حل زير را ارائه مي دهد.فرض کنيد بخوانيم نمونه اي ازکلاس Person را ايجاد کنيم. همانطور که مشاهده مي کنيد،در C# 3.0 به هنگام نمونه سازي، اين امکان در اختيار برنامه نويس قرار مي گيرد که هر يک از خصيصه هاي موجود در کلاس را به دلخواه و بنا به نياز مقدار دهي کند به صورت زير :

کد HTML:




Person person = new Person
{
Age = 21,
FirstName = «Mohamad Sadegh»,
LastName = "Mozafari"
};

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:05 PM
عبارات جست و جو (Query Expression) :

تيم طراح سي شارپ ويژگي فوق العاده اي را به آن اضافه کرد که برنامه نويسان را قادر مي سازد نحو (Syntax) زبان هاي پرس و جو مانند SQL و XQuery را با استفاده از اين زبان پياده سازي کنند. اين ويژگي با نام اختصاري LINQ شناخته مي شود و داراي انواع زير است:




§ LINQ-to-Entities - talks to "entities", part of ADO.NET 3.0


نمونه‌اي از کاربرد LINQ به صورت زير است:

کد HTML:



static void Main(string[] args)
{
var int_array = new int[] { 1, 2, 7, 9, 12 };

var selective_array = from c in int_array where c > 0 select c;

foreach (var selected in selective_array)
{
Console.WriteLine(selected);
{
}



توضيح : در مثال بالا ابتدا يک آرايه? int با مقداردهي اوليه تعريف شده‌است.سپس با استفاده از دستورات) LINQ که جز کلمات کليدي سي شارپ محسوب مي شوند)، آرايه اي با اعضاي بزرگتر از 5 انتخاب و در متغير ضمني محلي selective_array ذخيره مي شود.در نهايت اعضاي selective_array به صورت 7 و 9 و 12 خواهد بود.در توضيح اين ويژگي جديد به همين يک مثال بسنده مي کنيم چون بيان تمامي جنبه هاي LINQ خود نيازمند نگارش مقاله اي مفصل مي باشد.

? آرايه‌هاي نوع ضمني :آرايه‌ها را نيز مي‌توان با استفاده از کلمه کليدي var تعريف کرد.




static void Main(string[] args)
{
var a = new[] { 1, 10, 100, 1000 }; // int[]
var b = new[] { 1, "one", 2 }; // Error
}
گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:09 PM
پيش پردازنده

ويژگي «دستورات پيش پردازنده» سي شارپ(اگرچه آنها به واقع يک پيش پردازنده نيستند) مبني بر دستورات پيش پردازنده C است که به برنامه نويس اجازه تعريف سمبلهايي را مي‌دهند.برخي از اين دستورات عبارتند از : #if ، #region ، #define . راهنماهايي نظير #region تذکراتي به ويرايش گرها براي code foldingمي دهند.



توضيحات کد

توضيحات تک خط با استفاده از دو اسلش تعريف مي‌شوند(//) و توضيحات چند خطي با /* شروع و به */ ختم مي‌شوند.

کد HTML:



public class Foo
{
// a comment
public static void Bar(int firstParam) {} //Also a comment
}

public class FooBar
{
/* a comment */
public static void BarFoo(int firstParam) {} /* Also a comment */
توضيحات چند خطي هم چنين مي توانند با /* شروع و با */ تمام شوند.

کد HTML:



ublic class Foo
{
/* A Multi-Line
comment */
public static void Bar(int firstParam) {}
}

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:11 PM
پيش پردازنده

ويژگي «دستورات پيش پردازنده» سي شارپ(اگرچه آنها به واقع يک پيش پردازنده نيستند) مبني بر دستورات پيش پردازنده C است که به برنامه نويس اجازه تعريف سمبلهايي را مي‌دهند.برخي از اين دستورات عبارتند از : #if ، #region ، #define . راهنماهايي نظير #region تذکراتي به ويرايش گرها براي code foldingمي دهند.

سيستم مستند سازي XML

سيستم مستند سازي سي شارپ بسيار شبيه به جاوا است ، اما مبني بر XML. دو شيوه مستند سازي در حال حاضر به وسيله کامپايلر سي شارپ پشتيباني مي‌شود.

توضيحات تک خطي،که معمولا در توليد کننده کد Visual Studioپيدا مي شوند، با استفاده از /// شروع مي‌شوند.

کد HTML:



public class Foo
{
/// <summary>A summary of the method.</summary>
/// <param name="firstParam">A description of the parameter.</param>
/// <remarks>Remarks about the method.</remarks>
public static void Bar(int firstParam) {}
}

توضيحات چند خطي،که در نسخه 1.0 تعريف شدند ،اما در نسخه 1.1 پشتيباني از آنها وجود نداشت با /* شروع و به */ ختم مي‌شوند:

کد HTML:



public class Foo
{
/** <summary>A summary of the method.</summary>
* <param name="firstParam">A description of the parameter.</param>
* <remarks>Remarks about the method.</remarks> */
public static void Bar(int firstParam) {}
}



نکته:در اينجا يک ملاک سخت در مورد استفاده از فضاهاي خالي در سندهاي XML هنگام استفاده از /**وجود دارد:




/**
* <summary>
* A summary of the method.</summary>*/

نوع ديگري از کد بالا ارائه خواهد شد:
/**
* <summary>
A summary of the method.</summary>*/


سينتکس سندسازي توضيحات XML در يک ضميمه بي قاعده از استاندارد ECMAاز #C وجود دارد. يک استاندارد مشابه قوانيني براي پردازش توضيحات و تبديل آنها به متون Plain در XML را با کمک قوانين CLI فراهم مي کند. اين به هر IDE در #C و ديگر ابزار گسترش دهنده امکان پيدا کردن هر نمادي را در کدها مي دهد.

توضيحات کد

توضيحات تک خط با استفاده از دو اسلش تعريف مي‌شوند(//) و توضيحات چند خطي با /* شروع و به */ ختم مي‌شوند.

کد HTML:


public class Foo
{
// a comment
public static void Bar(int firstParam) {} //Also a comment
}

public class FooBar
{
/* a comment */
public static void BarFoo(int firstParam) {} /* Also a comment */

توضيحات چند خطي هم چنين مي توانند با /* شروع و با */ تمام شوند.

کد HTML:




public class Foo
{
/* A Multi-Line
comment */
public static void Bar(int firstParam) {}
}


گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:12 PM
بخش مرکزي .NET Framework ، محيط اجرايي Runtime مي‌باشد که اصطلاحاً به آن CLR يا .NET Runtime مي‌گويند.کدهايي که تحت کنترل CLR اجرا مي‌شوند اغلب به عنوان کدهاي مديريت شده ناميده مي‌شوند.

اگر چه،پيش از اين که کدها(همه زبان‌هاي .NET ) به وسيله CLR اجرا شوند،بايستي مورد کامپايل قرار گيرند.در .NET عمل کامپايل در دو مرحله صورت مي‌گيرد:

1) کامپايل سورس کد به MSIL.

2) کامپايل MSIL به کد مختص پلتفرم به وسيله CLR


يک نکته قابل توجه، اشتراک زبان مياني مايکروسافت با کد بايت جاوا(Bytecode)است.ايدة اين اشتراک از آنجا سرچشمه گرفت که چون Bytecode يک زيان سطح پايين با يک دستور زبان ساده مي‌باشد(که به جاي متن مبتني بر کدهاي عددي است) ،مي تواند به سرعت به کدهاي بومي(Native) ترجمه شود.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:13 PM
برخي ويژگي‌هاي MSIL

? شي گرايي و بکارگيري واسط‌ها

? تمايز فراوان بين انواع مقداري و ارجاعي

? تعيين Strong Type(نوع داده Variantديگر معتبر نيست)

? مديريت خطا از طريق به کارگيري Exceptio

? بکارگيري صفات



اشکالات


پلتفورم

منبع .NET مايکروسافت براي اجرا فقط ويندوز است .پياده سازي‌هاي ديگري براي اجراي برنامه‌هاي سي شارپ در ويندوز، لينوکس،BSD يا Mac OS X[[]] وجود دارند اما هنوز کامل نيستند : Mono و DotGNU در نوامبر سال 2002 توسط مايکروسافت(نسخه 1.0) براي پياده سازي CLI براي کار در Free BSD و Mac OS X 10.2 ارائه شد ، اما نسخه‌هاي بعدي آنها فقط قابل اجرا بر روي ويندوز بود.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:14 PM
برخي ويژگي‌هاي MSIL

? شي گرايي و بکارگيري واسط‌ها

? تمايز فراوان بين انواع مقداري و ارجاعي

? تعيين Strong Type(نوع داده Variantديگر معتبر نيست)

? مديريت خطا از طريق به کارگيري Exceptio

? بکارگيري صفات


پيشرفت در آينده

نسخه بعدي اين زبان، 4#C است که از اکتبر سال 2008 در حال ساخته شدن است.ماکروسافت ليستي از ويژگي هاي جديد 4#C را در کنفرانس توسعه دهندگان حرفه اي اعلام کرده است.تمرکز اصلي در ورژن بعدي روي قابليت هماهنگي فريم ورک ها و نوع زبان هايي است که کامال پويا يا قيمتي پويا هستند، مانند dynamic language runtime و COM. ويژگي هاي زير تا کنون اعلام شده اند:


پارامتر هاي نوع generic از نوع Covariant و contravariant:

پارامتر هاي واسط هاي generic و deletageها مي توانند با استفاده از کلمات out و in از دو نوع Covariant و contravariant باشند.اين تعيين نوع ها بعدا براي تبديل انواع به يکديگر، چه از نوع صريح يا مجازي و چه از نوع compile-time يا run-time به کار مي رود.به عنوان مثال، واسط IEnumerable<T> در زير دوباره تعريف شده است:

کد HTML:



interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}




بنابراين، هر کلاس مشتق شده اي که از IEnumerable<Derived> استفاه کرده باشد، با تمام کلاس هاي پايه که IEnumerable<Base> را دارند سازگار است.به عنوان تمرين، کد زير نوشته شده است:




void PrintAll(IEnumerable<object> objects)
{
foreach (object o in objects)
{
Console.WriteLine(o);
}
}

IEnumerable<string> strings = new List<string>();
PrintAll(strings); // IEnumerable<string> is implicitly converted to IEnumerable<object>

براي contravariance، رابط IComparer<T> به صورت زير دوباره تعريف شده است:
public interface IComparer<in T>
{
int Compare(T x, T y);
}



بنابراين، هر کلاسي که IComparer<Base> را براي يک کلاس پايه بيان مي کند، با IComparer<Derived> در تمام واسط ها و کلاس هايي که از آن کلاس پايه مشتق شده اند، سازگار است. اين امر نوشتن کد زير را ميسر مي سازد:






IComparer<object> objectComparer = GetComparer();
IComparer<string> stringComparer = objectComparer;

اشکالات


پلتفورم

منبع .NET مايکروسافت براي اجرا فقط ويندوز است .پياده سازي‌هاي ديگري براي اجراي برنامه‌هاي سي شارپ در ويندوز، لينوکس،BSD يا Mac OS X[[]] وجود دارند اما هنوز کامل نيستند : Mono و DotGNU در نوامبر سال 2002 توسط مايکروسافت(نسخه 1.0) براي پياده سازي CLI براي کار در Free BSD و Mac OS X 10.2 ارائه شد ، اما نسخه‌هاي بعدي آنها فقط قابل اجرا بر روي ويندوز بود.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:16 PM
جستجوي عضو پويا

در سيستم انواع داده هاي #C يک نوع جديد با نام شبه-نوع معرفي شده است که مانند System.Object رفتار مي کند، ولي در ادامه، هر دسترسي به اعضا يا برنامه هايي که از اين نوع استفاده مي کنند، بدون چک شدن نوع داده هايشان اجازه کار دارند و تجزيه آنها تا زمان اجرا به تعويق مي افتد. به عنوان مثال:

کد HTML:



// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}

GetLength("Hello, world"); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown here at run-time


صدا زده شدن هاي متد پويا، مانند پارامتر هاي صريح يا مجازي با مقدار نوع dynamic راه اندازي مي شوند. به عنوان مثال:

کد HTML:



void Print(dynamic obj)
{
Console.WriteLine(obj); // which overload of WriteLine() to call is decided at run-time
}

Print(123); // ends up calling WriteLine(int)
Print("abc"); // ends up calling WriteLine(string)


جستجوي پويا تحت سه مکانيزم مشخص اجرا مي شود: COM IDispatch براي اشيا COM ، رابط IDynamicObject DLR براي اشيا داراي اين واسط و Reflection براي بقيه اشيا.بنابراين هر کلاس #C مي تواند صدا زده شدن هاي پوياي خود را با اجراي IDynamicObject در نمونه هاي خود جدا کند. در مورد متدهاي پويا و مشخص کننده صدا زدن ها، تجزيه و تحليل اضافه بار مطابق انواع اصلي که به عنوان آرگومان ها هستند، در زمان اجرا اتفاق مي افتد، در غير اين صورت بر اساس قوانين تجزيه و تحليل اضافه بار #C عمل خواهد شد.به علاوه، در مواردي که در صدا زدن پويا، گيرنده خودش پويا نيست، تجزيه و اضافه بار زمان اجرا تنها به متد هايي که در زمان کامپايل به صورت گيرنده ظاهر شده اند، رسيدگي مي کند. به عنوان مثال:

کد HTML:



class Base
{
void Foo(double x);
}

class Derived : Base
{
void Foo(int x);
}

dynamic x = 123;
Base b = new Derived();
b.Foo(x); // picks Base.Foo(double) because b is of type Base, and Derived.Foo(int) is not exposed
dynamic b1 = b;
b1.Foo(x); // picks Derived.Foo(int)

هر مقداري که توسط دستيابي به عضو پويا برگردانده شده باشد، خودش از نوع پويا است.مقادير نوع پويا به ساير نوع ها و از ساير نوع عا قابل تبديل هستند. در نمونه کد بالا، اين امر به تابع GetLength اجازه با مقدار بازگردانده شده از Length بدون هيچ صريحي به عنوان integer استفاده کند.در زمان اجرا، مقدار واقعي به نوع خواسته شده تبديل مي شود.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:18 PM
کلمه کليدي اختياري ref

در حال حاظر کلمه کليدي ref براي متد هاي صدا زننده اختياري است. کد زير را در نظر بگيريد:
کد HTML:



void Increment(ref int x)
{
++x;
}

int x = 0;
Increment(ref x);

به صورت زير هم مي تواند نوشته شود:
کد HTML:



void Increment(ref int x)
{
++x;
}

int x = 0;
Increment(x);


آرگومنت هاي نام گذاري شده و پارامتر هاي اختياري

در 4#C پارامترهاي اختياري اي با مقادير پيش فرض موجود در ++C معرفي مي شوند. به عنوان مثال:
کد HTML:



void Increment(ref int x, int dx = 1)
{
x += dx;
}

int x = 0;
Increment(ref x); // dx takes the default value of 1
Increment(x, 2); // dx takes the value 2


به علاوه، براي کامل کردن پارامتر هاي اختياري، مي توانيد صريحا نام پارامتر ها را در صدازدن هاي متد ها تعيين کنيد.اين کار به شما اجازه تصويب کردن انتخابي براي هر زير مجموعه اختياري از پارامترهاي متد را مي دهد.تنها محدوديت موجود اين است که پارامتر هاي نام دار بايد بعد از پارامتر هاي بدون نام بيايند.نام پارامتر ها مي توانند براي هر دو نوع پارامتر هاي اختياري و ضروري تعيين شوند و مي توانند براي بهبود خوانايي و فراخواني دوباره آرگومان ها مفيد باشند. به عنوان مثال:
کد HTML:



Stream OpenFile(string name, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) { ... }

OpenFile("file.txt"); // use default values for both "mode" and "access"
OpenFile("file.txt", mode: FileMode.Create); // use default value for "access"
OpenFile("file.txt", access: FileAccess.Read); // use default value for "mode"
OpenFile(name: "file.txt", access: FileAccess.Read, mode: FileMode.Create); // name all parameters for extra readability, and use order different from method declaration


پارامتر هاي اختياري inter-operating را با COMراحت تر مي کنند. در گذشته، #C مجبور بود تمام پارامتر هاي متد سازنده COM را پشت سر بگذازد، حتي آنهايي را که اختياري بودند.به عنوان مثال:
کد HTML:



object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;

doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);


با پشتيباني از پارامتر هاي اختياري، کد بالا مي تواند به صورت زير خلاصه شود:
کد HTML:

doc.SaveAs("Test.docx");
گردآورنده: طه - Borna66

Borna66
01-05-2010, 07:19 PM
کتابخانه ها

جزئيات مشخصات #C، حداقل تعداد نوع ها و کتابخانه هاي کلاس است که کامپايلر نياز به وجود آن ها دارد.عملا، اغلب #C توسط بيشترين استفاده از CLI را مي کند، که استاندارد شده ECMA-335 است.

کد HTML:


مثال Hello world

در زير يک مثال ساده از برنامه #C آمده است، نسخه اي از مثال کلاسيک Hello world:




class ExampleClass
{
static void Main()
{
System.Console.WriteLine("Hello, world!");
}
}

نتيجه، چاپ شدن متن زير د خروجي است:

کد HTML:

Hello, world! هر خط هدفي دارد:

کد HTML:

class ExampleClass در بالا، تعريف کلاس آمده است.هر چيزي که در بين در علامت پرانتز باشد،ExampleClass را توصيف مي کند:

کد HTML:

static void Main() اين يک تابه عضو کلاس را در زمان شروع اجراي برنامه اعلان مي کند.دات نت در زمان اجرا، تابع Main را صدا مي زند(نکته: Main ممکن است از هر جاي ديگري نيز صدا زده شود، مثلا توسط تابع ExampleClass و با کد ()Main).کلمه کليدي static تابع را بدون داشتن نمونه اي از ExampleClass قابل دسترس مي کند.هر تابع Main در هر کنسولي بايد به صورت static تعريف شود.در غير اين صورت برنامه به يک نمونه نياز خواهد داشت و هر نمونه به يک برنامه نياز دارد.براي اجتناب از اين وابستگي دايره اي تجزيه ناپذير، کامپايلر هاي #C در صورت Static نبودن تابع Main، يک خطا اعلام مي کنند.کلمه کليدي void نشان دهنده اين است که تابع Main هيچ مقداري را بر نمي گرداند.

کد HTML:

Console.WriteLine("Hello, world!"); خط بالا، خروجي را مي نويسد.در فضاي اسم System، Console يک کلاس استاتيک است که يک ميانجي بين ورودي، خروجي و خطاي کنسول مي باشد.برنامه اي که متدWriteLine را از کنسول صدا مي زند،خروجي رشته "Hello, world!" را در خروجي نمايش مي دهد.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 08:02 PM
استانداردسازي

در آگوست سال 2000 ، شرکت مايکروسافت،و Hewlett-Packard و شرکت Intel به عنوان پشتيبان مشخصات سي شارپ را مانند CLI به سازمان استانداردسازي ECMA ارائه کردند.در دسامبر سال 2001 ، اين سازمان ، ECMA-334 را با عنوان مشخصات زبان سي شارپ منتشر کرد.سي شارپ در سال 2003 به عنوان يک استاندارد ISO به ثبت رسيد(ISO/IEC 23270).در سال 2002، ECMA دومين ويرايش از خصوصيات زبان سي شارپ را پذيرفت.

در ژوئن سال 2005 ، ECMA سومين ويرايش را با اضافه کردن مواردي همچون کلاس‌هاي partial ، متدهاي ناشناس ، انواع nullable و Genericها منتشر کرد. در جولاي 2005، ECMA استاندارد ها و TR ها را همراه با پردازش Fast-Track اخير به ISO/IEC JTC پيشنهاد کرد.اين روند معمولا 6 تا 9 ماه زمان مي برد. آخرين ويرايش اين زبان در 19 نوامبر سال 2007 در قالب Framework3.5ارائه گرديد

گردآورنده: طه - Borna66

Borna66
01-05-2010, 10:36 PM
کارائي

برنامه‌هاي سي شارپ ، همچون تمام برنامه‌هاي نوشته شده در .NET و ساير محيط‌هاي ماشيني مجازي مانند جاوا ، نيازمند منابع سيستم و حافظه بيشتري نسبت به برنامه‌هاي نوشته شده با ساير زبان‌ها مانند سي پلاس پلاس است و هم چنين سرعت کمتري نيز دارد. هر چند تعريف زبان #C و CLI تحت استانداردهاي ISO و ECMA استاندارد شده اند،CLI تنها قسمتي از Base Class Library (BCL) ماکروسافت مي باشد که شامل کلاس هاي غير استاندارد استفاده شده در برنامه هاي #C نيز مي شود.از اين گذشته، بعضي از قسمت هاي BCL تحت حق امتياز ماکروسافت هستند که ممکن است پياده سازي کامل framework را مختل کند، زيرا تنها بخش هاي استاندارد داراي حق محافظت RAND در برابر مدعيان را دارند.

گردآورنده: طه - Borna66

Borna66
01-05-2010, 10:36 PM
پياده سازي ها

متداول ترين کامپايلر #C ، Microsoft Visual C# مي باشد.

کامپايلرهاي C# :

? پروژه Microsoft Rotor (در حال حاضر به عنوان Shared Source Common Language Infrastructure شناخته مي‌شود) (ثبت شده فقط براي استفاده آموزشي و تحقيقي) يک پياده سازي منبع اشتراکي از CLR Runtime را فراهم مي‌آورد و يک کامپايلر سي شارپ، و يک زيرمجموعه از کتابخانه]] CLI Framework مورد نياز.

? پروژه Mono يک اوپن سورس از کامپايلر سي شارپ است،يک پياده سازي اوپن سورس کامل از CLI شامل کتابخانه‌هاي Framework مورد نياز که در ECMA ظاهر شده‌اند، و يک پياده سازي کامل نزديک به بقيه کتابخانه‌هاي اختصاصي کلاس .NET مايکروسافت.

? پروژه DotGNU نيز يک اوپن سورس از کامپايلر سي شارپ است، که پياده سازي آن بسيار نزديک به Common Language Infrastructure مي باشد و کتابخانه هاي framework مورد نياز موجود در ECMA و زير مجموعه اي از کلاس هاي کتابخانه اي شخصي ماکروسافت در دات نت و دات نت 2 را در بر دارد. کاملاً شبيه به پروژه Mono .
گردآورنده: طه - Borna66

Borna66
01-05-2010, 10:37 PM
نام زبان

اسم سي شارپ از علامت موسيقي شارپ گرفته شده است که در موسيقي بيان گر اين است که متن نوشته شده بايد نيم قدم از خط بالاتر باشد. مطابق با ECMA-334،بخش 6، مخفف‌ها و اختصارها ، نام زبان به صورت «#C» نوشته مي‌شود(«کلمه لاتين C (U+0043) به همراه علامت عددي #(U+0023)») که به صورت «سي شارپ» تلفظ مي‌شود.علامت «#» نبايد با علامت شارپ در موسيقي(? , U+266F) که در يک صفحه کليد استاندارد وجود ندارد اشتباه گرفته شود. پسوند شارپ، توسط بسياري ديگر از زبان هاي دات نت مانند #J،#Aو #F نيز به کار رفته است.پياده سازي اوليه از زبان ايفل تحت دات نت نيز #Eiffel نام داشت که الان زبان ايفل را به طور کامل پشتيباني مي کند.هم چنين اين پسوند بعضي وقت ها در کتابخانه ها نيز به کار مي رود، مانند #Gtkو #Cocoa و #Qt .

گردآورنده: طه - Borna66

Borna66
01-05-2010, 10:37 PM
کلمات اختصاري به کار رفته در اين تاپيک



PDC: Professional Developers Conference

IL (MSIL): Microsoft Intermediate Language

ECMA: European Computer Manufacturers Association

BCL: Base Class Library

CLI: Common Language Infrastructure

CLS: Common Language Specification

IEC: International Electrotechnical Commission

ISO: International Organization for Standardization

SDK: Software Development Kit

LINQ: Language Integrated Query

گردآورنده: طه - Borna66

m.r.t12
11-26-2010, 06:45 PM
ببخشید من یه سوال داشتم

Borna66
11-26-2010, 07:31 PM
ببخشید من یه سوال داشتم
با سلام خدمت شما دوست گرامي
مي تونيد سوالتون رو در تالار زير با عنوان مناسب بود تا در حد توان پاسختون رو بدهيم

مباحث خانواده ي سي ( Visual C, C#, C ) (http://pnu-club.com/pnu.79.html) > مباحث #C (http://pnu-club.com/pnu.736.html)

موفق باشيد

روزگار خوش