پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) سازندههاي پيشرفته : ماهيت تمامي برنامه هاي امروزي به گونه اي ست که با حجم عظيمي از دادهها سرو کار دارند.براي مديريت دادهها، نياز به کلاس هايي ست که در مهندسي نرم افزار آنها را 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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) عبارات جست و جو (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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) پيش پردازنده ويژگي «دستورات پيش پردازنده» سي شارپ(اگرچه آنها به واقع يک پيش پردازنده نيستند) مبني بر دستورات پيش پردازنده 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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) پيش پردازنده ويژگي «دستورات پيش پردازنده» سي شارپ(اگرچه آنها به واقع يک پيش پردازنده نيستند) مبني بر دستورات پيش پردازنده 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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) بخش مرکزي .NET Framework ، محيط اجرايي Runtime ميباشد که اصطلاحاً به آن CLR يا .NET Runtime ميگويند.کدهايي که تحت کنترل CLR اجرا ميشوند اغلب به عنوان کدهاي مديريت شده ناميده ميشوند. اگر چه،پيش از اين که کدها(همه زبانهاي .NET ) به وسيله CLR اجرا شوند،بايستي مورد کامپايل قرار گيرند.در .NET عمل کامپايل در دو مرحله صورت ميگيرد: 1) کامپايل سورس کد به MSIL. 2) کامپايل MSIL به کد مختص پلتفرم به وسيله CLR يک نکته قابل توجه، اشتراک زبان مياني مايکروسافت با کد بايت جاوا(Bytecode)است.ايدة اين اشتراک از آنجا سرچشمه گرفت که چون Bytecode يک زيان سطح پايين با يک دستور زبان ساده ميباشد(که به جاي متن مبتني بر کدهاي عددي است) ،مي تواند به سرعت به کدهاي بومي(Native) ترجمه شود. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) برخي ويژگيهاي MSIL ? شي گرايي و بکارگيري واسطها ? تمايز فراوان بين انواع مقداري و ارجاعي ? تعيين Strong Type(نوع داده Variantديگر معتبر نيست) ? مديريت خطا از طريق به کارگيري Exceptio ? بکارگيري صفات اشکالات پلتفورم منبع .NET مايکروسافت براي اجرا فقط ويندوز است .پياده سازيهاي ديگري براي اجراي برنامههاي سي شارپ در ويندوز، لينوکس،BSD يا Mac OS X[[]] وجود دارند اما هنوز کامل نيستند : Mono و DotGNU در نوامبر سال 2002 توسط مايکروسافت(نسخه 1.0) براي پياده سازي CLI براي کار در Free BSD و Mac OS X 10.2 ارائه شد ، اما نسخههاي بعدي آنها فقط قابل اجرا بر روي ويندوز بود. گردآورنده: طه - Borna66
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) برخي ويژگيهاي 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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) جستجوي عضو پويا در سيستم انواع داده هاي #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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) کلمه کليدي اختياري 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
پاسخ : همه چيز در مورد زبان برنامه نويسي سي شارپ (#c) کتابخانه ها جزئيات مشخصات #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