1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

شروع موضوع توسط minaaa ‏10/11/11 در انجمن C #C++

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    نوع داده 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
     
  2. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    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
     
  3. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    ويژگي‌هاي جديد در 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
     
  4. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    .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
     
  5. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    مقدار دهي Collection



    کد:

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


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

    کد HTML:
    کد:

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

    گردآورنده: طه - Borna66
     
  6. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    انواع داده اي بي نام

    کد 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 ​
     
  7. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    نتيجه نوع متغير محلي


    کد HTML:

    کد:

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

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

    کد:

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

    گردآورنده: طه - Borna66 ​
     
  8. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    عبارات لامبدا :

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

    کد:

    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​
     
  9. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    خواص خودکار

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


    کد:

    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
     
  10. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c)

    توابع جزئي

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

    متغيرهاي ضمني محلي :
    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