وثائق C#
مرجع موجز ومدعّم بأمثلة للغة C#. اقرأ المفهوم، شاهد الكود، ثم تدرّب عليه في رحلة Coddy.
ابدأ رحلة موجَّهة في C#البداية
- ما هي C#C# لغة عامة الأغراض ثابتة الأنواع من Microsoft تعمل على .NET. فيمَ تُستخدم، وما علاقتها بـ .NET، وما الذي أضافه كل إصدار، وكيف يُبنى برنامج C#.
- Hello Worldأول برنامج C# سطرًا سطرًا: الدالة Main، وConsole.WriteLine وWrite، وقراءة المدخلات بـ Console.ReadLine، والتعليقات، وإنشاء مشروع وتشغيله بأداة dotnet، والعبارات عالية المستوى.
- C# مقابل Javaتتشابه C# وJava في الشكل وتحلّان مشكلات متقاربة. الفروق الحقيقية في الخصائص وأنواع القيم والأنواع العامة وLINQ مقابل streams والبرمجة غير المتزامنة والاستثناءات والمنظومات المحيطة بهما. مقارنة جنبًا إلى جنب مع الشيفرة.
- C# مقابل C++C# لغة مُدارة بجامع نفايات؛ وC++ تُترجم إلى شيفرة أصلية وتمنحك تحكمًا يدويًا في الذاكرة. كيف يظهر هذا الفرق في الأمان والأداء ومحركات الألعاب ونموذج البناء وصعوبة تعلّم كل منهما.
- فضاءات الأسماء وusingكيف تنظّم فضاءات الأسماء في C# الأنواع وكيف تستوردها الموجّهة using: الأسماء المستعارة، وusing static، والأسماء المؤهّلة كاملًا، وإصلاح المراجع الملتبسة، وglobal using، وفضاءات الأسماء على مستوى الملف.
الأساسيات
- المتغيّراتكيف تصرّح بالمتغيّرات وتسند إليها في C#، ومتى تكون var فكرة جيدة ومتى لا تكون، وكيف يعمل النطاق، والفرق بين const وreadonly وstatic readonly، وأعراف التسمية، وخطأ المتغيّر غير المُسنَد.
- أنواع البياناتكل نوع مدمج في C# بحجمه ونطاقه ولاحقة قيمته الحرفية، والفرق بين أنواع القيم والأنواع المرجعية، ولماذا decimal هو نوع المال، وتجاوز سعة الأعداد الصحيحة وchecked، والقيم الافتراضية.
- تحويل النص إلى intكيف تحوّل نصًا إلى int في C# بـ int.Parse وint.TryParse وConvert.ToInt32، وكيف يعمل التحويل الضمني والصريح، ولماذا يقتطع تحويل double الكسر، والمعاملان as وis، ولماذا قد يُقرأ "1.5" على أنه 15.
- المعاملاتمعاملات C# بسلوكها الدقيق: قسمة الأعداد الصحيحة، ومعامل باقي القسمة مع الأرقام السالبة، والزيادة والإسناد المركّب، والمقارنة، والمنطق قصير الدارة، والمعاملات البتّية، ومعاملات null، وجدول الأولوية.
- النصوصكيف تعمل النصوص في C#: عدم القابلية للتغيير، وLength والفهرسة، والمقارنة بـ == وEquals وstring.Compare، ومحارف الهروب، ونصوص @ الحرفية والنص متعدد الأسطر، والنصوص الحرفية الخام، وفحص null والفراغ، والمرور على المحارف.
- Substringكيف تعمل String.Substring في C#: وسيطا فهرس البداية والطول، والاستثناء ArgumentOutOfRangeException وكيف تتجنّبه، واستخراج النص حول نتائج IndexOf، وأخذ أول n محارف أو آخرها، ومعامل النطاق من C# 8.
- استيفاء النصوصكيف يعمل استيفاء النصوص $"..." في C#: التعابير داخل الأقواس المعقوصة، ومحدّدات التنسيق مثل F2 وN0 وC وD5 وX، والمحاذاة للجداول، وهروب الأقواس، وstring.Format والتنسيق المركّب، والنصوص المستوفاة الحرفية والخام، والتنسيق لثقافة محددة.
- دوال النصوصدوال String التي تستخدمها كل يوم في C#: Split بعدة فواصل وخيارات، وReplace، وContains والبحث غير الحساس لحالة الأحرف، وIndexOf وLastIndexOf، وStartsWith وEndsWith، وTrim، وToUpper وToLower، وPadLeft، وJoin، وConcat، وعكس النص.
- StringBuilderلماذا يكون ضمّ النصوص المتكرر في حلقة بطيئًا في C#، وكيف يعالج StringBuilder ذلك: Append وAppendLine وAppendFormat وInsert وRemove وReplace والسعة، ومتى يكون الضمّ العادي أو string.Join الخيار الأفضل.
- الأرقام العشوائيةكيف تولّد أرقامًا عشوائية في C# بالصنف Random: الدالة Next وحدّها الأعلى غير المشمول، وقيم double عشوائية في نطاق، والبذور لنتائج قابلة للتكرار، واختيار عنصر عشوائي، وخلط قائمة، وفخ new Random داخل حلقة، والأرقام الآمنة تشفيريًا.
- DateTimeالعمل مع التواريخ والأوقات في C#: إنشاء قيم DateTime، وNow مقابل UtcNow مقابل Today، وإضافة الأيام والأشهر، والطرح للحصول على TimeSpan، وTotalHours مقابل Hours، ومقارنة التواريخ، وDayOfWeek، والقراءة بـ ParseExact وTryParse، وDateTimeOffset، وDateOnly.
- تنسيق DateTimeكيف تنسّق DateTime كنص في C#: نصوص التنسيق القياسية (d وD وo وs وu وt)، والأنماط المخصصة مثل yyyy-MM-dd HH:mm:ss، وجدول كامل للمحدّدات، وكيف تغيّر الثقافة المخرجات، والذهاب والإياب بصيغة ISO 8601 عبر "o"، وأخطاء mm مقابل MM وhh مقابل HH.
التحكم في التدفق
- if elseكيف تعمل if وelse if وelse في C#: لماذا يجب أن تكون الشروط من نوع bool، ودمج الاختبارات بـ && و|| و!، ومتى تهمّ الأقواس المعقوصة، وجمل الحراسة بدل التداخل العميق، وخطأَي = مقابل == والفاصلة المنقوطة الشاردة.
- جملة switchكيف تعمل جملة switch في C#: التفرّع على قيم int وstring وchar وenum، ولماذا تحتاج كل حالة إلى break (الخطأ CS0163)، وتكديس عناوين case لعدة قيم، وgoto case، وdefault، وحساسية حالة الأحرف في النصوص، وعناوين case النمطية مع when.
- تعبير switchيحوّل تعبير switch في C# 8 قيمة إلى نتيجة بأذرع نمطية بدل case وbreak. الصياغة، والمُهمَل _، وأنماط الخصائص والصفوف والعلائقية، وand/or/not، وحراسات when، وتحذيرات الشمول وSwitchExpressionException، مع مكافئات C# 7 قابلة للتشغيل.
- المعامل الثلاثييختار المعامل الشرطي condition ? a : b في C# إحدى قيمتين. كيف يُقيَّم، ولماذا يحتاج الفرعان إلى نوع مشترك (CS0173) والتحويل الذي يصلح ذلك، والمعاملات الثلاثية المتداخلة، والأقواس في استيفاء النصوص، ومتى تعبّر ?? و?. عن ذلك أفضل.
- حلقة forكيف تعمل حلقة for في C#: المهيّئ والشرط والمكرِّر، والعدّ التنازلي والقفز بخطوات، وعدة متغيّرات للحلقة، والمرور على المصفوفات بالفهرس، والحلقات المتداخلة، وfor(;;)، وخطأَي الإزاحة بواحد والحذف أثناء المرور.
- حلقة foreachكيف تعمل foreach في C#: المرور على المصفوفات والقوائم والنصوص والقواميس (KeyValuePair والتفكيك)، والحصول على الفهرس، ولماذا متغيّر الحلقة للقراءة فقط، والاستثناء InvalidOperationException برسالة "Collection was modified" وحلوله، وما يحتاجه النوع كي يُستخدم في foreach.
- حلقة whileكيف تعمل حلقتا while وdo while في C#: الشرط الذي يُفحص قبل الجسم أو بعده، وقراءة المدخلات حتى قيمة حارسة أو نهاية المدخلات، وwhile (true) مع break، وأخطاء الحلقات اللانهائية التي توقع الناس.
- break وcontinueكيف تعمل break وcontinue وgoto في C#: إنهاء الحلقة مبكرًا، وتخطي تكرار، وbreak داخل switch، وثلاث طرق للخروج من الحلقات المتداخلة (علامة، أو goto، أو دالة مع return)، وخطأ الحلقة اللانهائية بسبب continue داخل while.
الدوال والمفوضات
- الدوالكيف تصرّح بالدوال وتستدعيها في C#: أنواع الإرجاع وvoid، والمعاملات، والدوال بجسم تعبيري، وإعادة عدة قيم بصف، والتحميل الزائد، ومصفوفات params، والدوال الساكنة مقابل دوال المثيل، والدالة Main، والاستدعاء الذاتي، والدوال المحلية.
- المعاملات الاختياريةكيف تعمل المعاملات الاختيارية والوسائط المسمّاة في C#: القيم الافتراضية وقاعدة الثابت وقت الترجمة، وترتيب المعاملات، وتخطي الوسائط بالاسم، والمعاملات الاختيارية مقابل التحميل الزائد، وسمات معلومات المستدعي، وفخ الإصدارات بسبب القيم الافتراضية المدمجة في المستدعين.
- ref وoutكيف تعمل المعاملات ref وout وin في C#: تمرير المتغيّر بدل نسخة، وout للنتائج الإضافية ونمط TryParse، وout var، ومعاملات in للقراءة فقط، وقواعد الإسناد المؤكّد، وما الذي يتغيّر حين يكون الوسيط نوعًا مرجعيًا.
- تعابير Lambdaكيف تعمل تعابير lambda في C#: صياغة => بكل أشكالها، وتخزين lambda في Func وAction، وتمريرها إلى الدوال وLINQ، وlambda العبارات، والإغلاقات على المتغيّرات الملتقطة، وخطأ الالتقاط في حلقة for الذي لا يوجد في foreach.
- المفوّضاتما هو المفوّض (delegate) في C# وكيف تستخدمه: التصريح بنوع مفوّض، وإنشاؤه من دالة أو تعبير lambda أو دالة مجهولة، واستدعاؤه، والمفوّضات كدوال استدعاء راجع، والمفوّضات المتعددة بـ += و-=، وفحص null بـ ?.Invoke، وعلاقة المفوّضات بـ Func وAction والأحداث.
- Func وActionكيف تعمل Func وAction في C#: Func<T, TResult> للدوال التي تعيد قيمة، وAction<T> للتي لا تعيد، وPredicate وComparison، وتمرير الدوال وإعادتها، وقاموس الأوامر، وتعابير lambda غير المتزامنة، ومتى تصرّح بمفوّضك الخاص بدلًا منها.
- الأحداثكيف تعمل الأحداث في C#: التصريح بحدث بـ EventHandler وEventHandler<T>، وأصناف EventArgs المخصصة، والاشتراك وإلغاؤه بـ += و-=، وإطلاق الحدث بأمان بـ ?.Invoke، ولماذا يتفوق الحدث على حقل مفوّض عام، وتسرّب الذاكرة الناتج عن نسيان إلغاء الاشتراك.
- دوال التوسيعكيف تعمل دوال التوسيع في C#: دالة ساكنة في صنف ساكن مع this على المعامل الأول، واستدعاؤها كدالة مثيل، وتوسيع string والتعدادات وIEnumerable<T>، وكيف بُني LINQ منها، ولماذا تفوز دوال المثيل، والمستقبِل null، وموجّهة using التي تحتاجها.
المجموعات و LINQ
- المصفوفاتالمصفوفة في C# كتلة ثابتة الحجم من عناصر من نوع واحد. تعلّم كيف تصرّح بالمصفوفات وتهيّئها، وتقرأ Length، وتفرز وتبحث بالصنف Array، وتنسخها بأمان، وتعمل مع المصفوفات ثنائية الأبعاد والمسنّنة.
- ListList<T> هي المصفوفة القابلة للنمو في C#. تعلّم كيف تنشئ قائمة، وتضيف العناصر وتدرجها، وتحذف بالقيمة أو الفهرس أو الشرط، وتبحث بـ Contains وFind، وتفرز بحسب خاصية، وتتجنّب الخطأ الناتج عن تغيير قائمة داخل foreach.
- Dictionaryيربط Dictionary<TKey, TValue> المفاتيح بالقيم مع بحث سريع. تعلّم كيف تضيف المدخلات وتحدّثها، وتقرأ بأمان بـ TryGetValue، وتمرّ على مدخلات KeyValuePair، وتعدّ التكرارات، وتتجاهل حالة الأحرف في المفاتيح، وتبقي المفاتيح مرتّبة بـ SortedDictionary.
- HashSetيحمل HashSet<T> عناصر فريدة ويجيب عن Contains في زمن ثابت. تعلّم كيف تبلّغ Add عن التكرارات، وكيف تزيل التكرارات من قائمة، وكيف تجري الاتحاد والتقاطع والطرح بين المجموعات، وكيف تجعل المجموعة تقارن كائناتك بالقيمة.
- QueueQueue<T> مجموعة الداخل أولًا يخرج أولًا: تغادر العناصر بترتيب وصولها. تعلّم Enqueue وDequeue وPeek، واستثناء الطابور الفارغ وTryDequeue، والبحث بالعرض أولًا بطابور، ومتى تلجأ إلى ConcurrentQueue أو PriorityQueue.
- StackStack<T> مجموعة الداخل أخيرًا يخرج أولًا: العنصر المضاف آخرًا يخرج أولًا. تعلّم Push وPop وPeek، واستثناء المكدّس الفارغ وTryPop، ولماذا يُعدَّد المكدّس معكوسًا، واستخدامين تقليديين: سجل التراجع وفحص توازن الأقواس.
- الصفوفيجمع الصف (tuple) في C# بضع قيم في قيمة واحدة دون التصريح بنوع. تعلّم صياغة value tuple، والعناصر المسمّاة، وإعادة عدة قيم من دالة، والتفكيك بـ var (a, b)، ومفاتيح الصفوف في القاموس، وكيف يختلف ValueTuple عن System.Tuple الأقدم.
- LINQيضيف LINQ معاملات الاستعلام إلى كل مجموعة في C#. تعلّم صياغة الدوال وصياغة الاستعلام، والتصفية بـ Where، والإسقاط بـ Select، والفرز بـ OrderBy وThenBy، والتجميع بـ GroupBy، وفخ First مقابل FirstOrDefault، والتجميعات، وكيف يغيّر التنفيذ المؤجّل موعد تشغيل استعلامك.
- IEnumerable وyieldIEnumerable<T> هي الواجهة التي تقف خلف foreach وLINQ، وyield return أسهل طريقة لتنفيذها. تعلّم علاقة IEnumerable بـ ICollection وList، وكيف تعمل دالة المكرِّر خطوة بخطوة، وyield break، والتسلسلات اللانهائية، وأفخاخ التقييم الكسول.
الأصناف والأنواع
- الأصناف والكائناتكيف تصرّح بصنف في C#، وتمنحه حقولًا ودوالًا، وتنشئ كائنات بـ new، وما معنى أن الصنف نوع مرجعي: الكائنات المشتركة، وnull وNullReferenceException، وToString ومهيّئات الكائنات.
- المُنشئاتكيف تعمل المُنشئات في C#: المُنشئ الافتراضي الضمني ومتى يختفي، والمُنشئات ذات المعاملات والمحمّلة، والتسلسل بـ this(...) وbase(...)، وترتيب تنفيذ الأشياء، والمُنشئات الساكنة والخاصة، والمُنشئات الأساسية في C# 12.
- الخصائصكيف تعمل الخصائص في C#: موصّلا get وset فوق حقل داعم، والخصائص التلقائية، وprivate set والخصائص للقراءة فقط، والخصائص المحسوبة، والتحقق في الضوابط، والكلمتان init وrequired من C# 9 و11.
- الكلمة staticما معنى static في C#: أعضاء تنتمي إلى النوع لا إلى كائن، وحالة مشتركة بين المثيلات، والدوال والأصناف الساكنة، والمُنشئات الساكنة، وconst مقابل static readonly، وusing static، والخطأ CS0120.
- معدّلات الوصولمعدّلات الوصول الستة في C# (public وprivate وprotected وinternal وprotected internal وprivate protected)، وما يسمح به كل منها، والقيم الافتراضية حين لا تكتب شيئًا، وأخطاء المترجم التي تنتجها.
- الوراثةكيف تعمل وراثة الأصناف في C#: الاشتقاق بالنقطتين، وما يُورث وما لا يُورث، واستدعاء الصنف الأساس بـ base، وvirtual وoverride، والإخفاء بـ new (والمخرجات التي تفاجئ الجميع)، وsealed، وتعدد الأشكال، والتحويل صعودًا ونزولًا في التسلسل الهرمي.
- الأصناف المجرّدةما هو الصنف المجرّد في C#: صنف أساس لا يمكن إنشاء مثيل منه ويمكنه التصريح بأعضاء مجرّدة يجب أن تنفّذها أصنافه المشتقة. يغطي الدوال والخصائص المجرّدة، والمُنشئات، ونمط الدالة القالب، ومتى تختار واجهة بدلًا منه.
- الواجهاتكيف تعمل الواجهات في C#: التصريح بواحدة، وتنفيذها في الأصناف والبنى، واستخدام الواجهة كنوع، وتنفيذ عدة واجهات معًا، والتنفيذ الصريح، وواجهات الإطار التي ستنفّذها أكثر من غيرها (IComparable<T> وIEnumerable<T> وIDisposable)، ودوال الواجهة الافتراضية في C# 8.
- البنىكيف تعمل البنى في C#: دلالات القيمة والنسخ عند الإسناد، وخطأ التعديل في List<T>، وقواعد المُنشئات، والمساواة، والتغليف (boxing)، وreadonly struct وrecord struct، ومقارنة البنية بالصنف مع إرشادات متى تكون البنية الخيار الصحيح.
- التعداداتكيف تعمل التعدادات في C#: التصريح بثوابت مسمّاة، والقيم الصحيحة الأساسية والتحويل، وتحويل التعداد إلى نص والنص إلى تعداد بـ Parse وTryParse، وسرد كل القيم، و[Flags] مع المعاملات البتّية وHasFlag، والتفرّع على تعداد، ومعالجة القيم غير المعرّفة.
- السجلاتما هي السجلات في C# (C# 9 وما بعده): الصياغة الموضعية، والأعضاء التي يولّدها المترجم، والمساواة بالقيمة، والنسخ غير المدمّرة بـ with، وToString المدمجة، وrecord struct من C# 10، والوراثة بين السجلات، والصنف المكافئ مكتوبًا يدويًا.
- الأنواع العامةكيف تعمل الأنواع العامة في C#: كتابة أصناف ودوال عامة بمعاملات نوع، واستنتاج الأنواع، والقيود بـ where (class وstruct وnew() والأصناف الأساسية والواجهات)، وdefault(T)، والأعضاء الساكنة لكل نوع، والتغاير مع IEnumerable<out T>.
- الأنواع القابلة لـ nullكل شيء عن null في C#: أنواع القيم القابلة لـ null (int? وNullable<T>) مع HasValue وValue وGetValueOrDefault، ومعاملا دمج null ?? و??=، والمعامل الشرطي لـ null ?.، وفحوص null، وأنواع المراجع القابلة لـ null (string?) من C# 8.
- مطابقة الأنماطكيف تعمل مطابقة الأنماط في C#: المعامل is مع أنماط النوع والثوابت، وجمل switch بأنماط case وwhen، وتعابير switch، وأنماط الخصائص والصفوف والمواضع، والأنماط العلائقية والمنطقية (and وor وnot)، وأنماط القوائم، وأي إصدار من C# أضاف كلًّا منها.
الاستثناءات
- Try Catchtry وcatch وfinally هي طريقة C# في معالجة الاستثناءات. تعلّم كيف ينتقل الاستثناء صعودًا في مكدّس الاستدعاءات، وكيف تلتقط أنواع استثناءات محددة بالترتيب الصحيح، وتصفّي بـ when، وتنظّف في finally، وتعيد الرمي بـ throw; دون فقدان أثر المكدّس، وأي الاستثناءات لا تلتقطها.
- رمي الاستثناءاتكيف ومتى ترمي الاستثناءات في C#. تعلّم عبارة throw، وأي نوع استثناء مدمج يناسب أي خطأ، وتعابير throw مع ?? و?:، والدوال المساعدة ThrowIfNull، وكيف تكتب صنف استثناء مخصصًا ببياناته الخاصة واستثناء داخلي.
- العبارة usingتضمن العبارة using استدعاء Dispose على الملفات والتدفقات والاتصالات وسائر كائنات IDisposable، حتى حين يُرمى استثناء. تعلّم ما تُترجم إليه، وترتيب التخلّص من الكائنات، وتصريح using في C# 8، وكيف تنفّذ IDisposable في صنفك.
البرمجة غير المتزامنة والخيوط
- Async Awaitتتيح async وawait لشيفرة C# انتظار العمليات البطيئة دون حجز خيط. تعلّم كيف تعمل الدالة غير المتزامنة، وTask وTask<T>، وتشغيل العمليات المستقلة في الوقت نفسه بـ Task.WhenAll، والاستثناءات في الشيفرة غير المتزامنة، ولماذا تسبّب async void و.Result أخطاءً وجمودًا.
- المهامTask هي وحدة العمل غير المتزامن والمتوازي في .NET. تعلّم Task.Run للعمل كثيف المعالجة، وقراءة النتائج، ودمج المهام بـ WhenAll وWhenAny، والاستكمالات، والإلغاء بـ CancellationToken، وكيف تختلف Task عن Thread، ومتى يناسب Parallel.For أكثر.
- Lockتسمح العبارة lock لخيط واحد فقط في كل مرة بتشغيل كتلة شيفرة. شاهد حالة سباق تفسد عدّادًا، وأصلحها بـ lock، وتعلّم أي كائن تقفل عليه، واستخدم Interlocked للعدّادات البسيطة، وتجنّب الجمود الناتج عن ترتيب الأقفال، واستخدم SemaphoreSlim حين تنتظر الشيفرة داخلها بـ await.
- المؤقّتفي C# عدة أصناف مؤقّتات تتصرف بشكل مختلف. تعلّم متى تستخدم System.Threading.Timer وSystem.Timers.Timer وPeriodicTimer أو مؤقّت الواجهة، وكيف تبدؤها وتوقفها، ولماذا تعمل دوال الاستدعاء الراجع على مجمّع الخيوط وقد تتداخل، ولماذا يجب أن يبقى المؤقّت مُشارًا إليه، وكيف تقيس الوقت المنقضي بـ Stopwatch.
الملفات و JSON والمزيد
- قراءة الملفات وكتابتهاكيف تكتب في ملف وتقرأ ملفًا في C#: File.WriteAllText وReadAllText وAppendAllText وWriteAllLines وReadAllLines للملفات الكاملة، وStreamWriter وStreamReader للملفات الكبيرة، والمسارات بـ Path.Combine، والمجلدات، والترميزات، والاستثناءات التي يجب أن تعالجها شيفرة الملفات.
- JSONكيف تعمل مع JSON في C# باستخدام System.Text.Json: JsonSerializer.Serialize وDeserialize، ومخرجات camelCase والمخرجات المنسّقة، والسمات مثل JsonPropertyName وJsonIgnore، والتعدادات كنصوص، وقراءة JSON دون أصناف عبر JsonDocument وJsonNode، والأخطاء، ومقارنتها بـ Newtonsoft.Json.
- Regexكيف تستخدم التعابير النمطية في C# مع System.Text.RegularExpressions: IsMatch وMatch وMatches، والمجموعات المرقّمة والمسمّاة، وReplace مع الاستبدالات وتعبير lambda، وSplit، وRegexOptions، ونصوص الأنماط الحرفية، والتحقق من المدخلات، والمهل الزمنية، والسمة GeneratedRegex في .NET 7.
- الانعكاس والسماتكيف يعمل الانعكاس في C#: كائنات Type من typeof وGetType، وقراءة الخصائص وضبطها، واستدعاء الدوال بأسمائها، وإنشاء المثيلات، والسمات: المدمجة منها مثل Obsolete، والتصريح بسماتك، وقراءتها وقت التشغيل. إضافة إلى كلفة الانعكاس.