
كورس #C كامل | شرح م أحمد ممدوح - منحة ITI #2
Syntax Error
Overview
يقدم هذا الفيديو شرحًا مفصلاً للمكونات الأساسية لبيئة وقت تشغيل .NET (CLR) ودوره في تشغيل تطبيقات C#. يبدأ بشرح وظائف المكونات الرئيسية مثل محمل الفئات (Class Loader)، والمترجم الفوري (JIT Compiler)، وجامع القمامة (Garbage Collector)، ومدير الكود (Code Manager)، ومحرك الأمان (Security Engine)، ومدير الاستثناءات (Exception Manager)، ومدير الخيوط (Thread Manager). كما يتطرق إلى أهمية نظام الأنواع المشتركة (CTS) ودوره في توحيد الأنواع عبر لغات .NET المختلفة. يستعرض الفيديو أيضًا تاريخ إصدارات .NET Framework و C#، مع التركيز على كيفية إنشاء مشروع جديد في Visual Studio، وفهم بنية الكود الأساسية، والتعامل مع أنواع البيانات الأساسية (Value Types و Reference Types)، وكيفية قراءة وكتابة البيانات من وإلى وحدة التحكم، بالإضافة إلى شرح مفاهيم مثل تمرير القيم بالمرجع (Pass by Reference) باستخدام `ref` و `out`، والتعامل مع الاستثناءات باستخدام `TryParse`.
Save this permanently with flashcards, quizzes, and AI chat
Chapters
- محمل الفئات (Class Loader) مسؤول عن تحميل الفئات إلى الذاكرة عند الحاجة إليها فقط، مما يحسن كفاءة استخدام الذاكرة.
- المترجم الفوري (JIT Compiler) يحول كود C# (IL) إلى كود أصلي (Native Code) أثناء وقت التشغيل.
- جامع القمامة (Garbage Collector) يدير الذاكرة تلقائيًا، حيث يتتبع الذاكرة المحجوزة ويزيلها عندما لا تكون قيد الاستخدام، مما يريح المطورين من عبء إدارة الذاكرة يدويًا.
- مدير الكود (Code Manager) يتعامل مع الكود المدار (Managed Code) وغير المدار (Unmanaged Code)، ويسمح بالتكامل مع لغات مثل C++.
- محرك الأمان (Security Engine) يطبق قواعد الأمان أثناء وقت التشغيل.
- مدير الاستثناءات (Exception Manager) يتعامل مع الأخطاء والاستثناءات التي تحدث أثناء تشغيل التطبيق، مما يسمح بمعالجتها وتجنب انهيار البرنامج.
- مدير الخيوط (Thread Manager) يدعم إنشاء وإدارة خيوط متعددة داخل التطبيق الواحد.
- نظام الأنواع المشتركة (CTS) يحدد مجموعة قياسية من أنواع البيانات والقواعد التي يجب على جميع لغات .NET الالتزام بها، مما يضمن التوافق بين اللغات المختلفة.
- يوجد اسمان لنوع البيانات: اسم لغة البرمجة (مثل `int` في C#) واسم CLR (مثل `System.Int32`).
- تاريخ .NET Framework شهد تطورًا عبر إصدارات متعددة (2002، 2003، 2005، إلخ)، وكذلك لغة C# (C# 1، C# 2، إلخ).
- ظهر .NET Core كبديل عبر المنصات، وتطور لاحقًا ليصبح .NET (بدءًا من .NET 5)، والذي يجمع بين مزايا .NET Framework و .NET Core.
- الإصدارات الحديثة من Visual Studio (مثل 2015 وما بعدها) تدعم معظم ميزات C# الحديثة.
- يتم إنشاء مشروع C# جديد في Visual Studio باختيار قالب (Template) مناسب، مثل 'Console App'.
- المشروع يتكون من ملفات كود (بامتداد .cs) وملفات أخرى، ويتم تنظيم الكود داخل مساحات أسماء (Namespaces).
- كل تطبيق C# له نقطة دخول رئيسية (Entry Point)، وهي عادةً دالة `Main`، والتي يجب أن تكون `static`.
- تُستخدم `Console.WriteLine()` لعرض النصوص على وحدة التحكم، و `Console.ReadLine()` لقراءة المدخلات من المستخدم.
- يجب استخدام `using` لاستيراد مساحات الأسماء التي تحتوي على الفئات التي تريد استخدامها (مثل `System`).
- تنقسم أنواع البيانات في C# بشكل أساسي إلى أنواع قيمية (Value Types) وأنواع مرجعية (Reference Types).
- أنواع القيم مثل `int`, `float`, `double`, `bool` تُخزن قيمتها مباشرة.
- أنواع القيم يجب تهيئتها (Initialized) بقيمة قبل استخدامها، وإلا سيظهر خطأ وقت التصريف (Compile-time error).
- القيم الحرفية (Literals) مثل الأرقام العشرية تُعتبر افتراضيًا `double`، ولتعريفها كـ `float` أو `decimal` يجب إضافة لاحقة (مثل `f` أو `m`).
- يمكن استخدام الكلمة المفتاحية `default` للحصول على القيمة الافتراضية لنوع بيانات معين.
- لا يمكن تحويل أنواع البيانات بشكل ضمني (Implicit Conversion) من نوع ذي دقة أعلى إلى نوع ذي دقة أقل (مثل `double` إلى `int`) دون فقدان بيانات، مما يتطلب تحويلًا صريحًا (Explicit Conversion أو Casting).
- يمكن تحويل سلسلة نصية (String) إلى نوع رقمي باستخدام دوال مثل `int.Parse()` أو `Convert.ToInt32()`.
- دوال `Parse` ترمي استثناء (Exception) إذا فشلت عملية التحويل، مما قد يؤدي إلى انهيار البرنامج.
- لتجنب انهيار البرنامج عند فشل التحويل، يُفضل استخدام `int.TryParse()` التي تعيد قيمة منطقية (true/false) تشير إلى نجاح العملية، وتضع القيمة المحولة في متغير مُمرر بالكلمة المفتاحية `out`.
- مفهوم `Discard` (يُمثل بـ `_`) يُستخدم لتجاهل قيمة مُرجعة غير ضرورية، مثل القيمة المنطقية من `TryParse` إذا لم تكن بحاجة إليها.
- افتراضيًا، تُمرر أنواع القيم (Value Types) إلى الدوال عن طريق القيمة (Pass by Value)، مما يعني أن أي تغيير داخل الدالة لا يؤثر على المتغير الأصلي.
- يمكن تمرير أنواع القيم بالمرجع (Pass by Reference) باستخدام الكلمة المفتاحية `ref`، مما يسمح للدالة بتعديل قيمة المتغير الأصلي.
- الكلمة المفتاحية `out` تُستخدم أيضًا للتمرير بالمرجع، ولكنها تتطلب أن تكون القيمة المُمررة غير مهيأة (Uninitialized) وأن تقوم الدالة بتعيين قيمة لها قبل الخروج.
- الفرق الرئيسي بين `ref` و `out` هو أن `ref` تتطلب تهيئة المتغير قبل تمريره، بينما `out` لا تتطلب ذلك وتضمن أن الدالة ستقوم بتعيين قيمة له.
- يمكن استخدام `ref` و `out` معًا في نفس التطبيق، مما يوفر مرونة أكبر في تصميم الدوال التي تحتاج إلى تعديل قيم متعددة أو إرجاع قيم إضافية.
Key takeaways
- CLR هو المحرك الأساسي لتشغيل تطبيقات .NET، ويفهم الكود الوسيط (IL) ويحوله إلى كود أصلي.
- إدارة الذاكرة التلقائية بواسطة Garbage Collector تقلل من الأخطاء الشائعة في لغات مثل C++.
- نظام الأنواع المشتركة (CTS) يضمن التوافق بين لغات .NET المختلفة.
- يجب تهيئة المتغيرات من أنواع القيم (Value Types) قبل استخدامها لتجنب الأخطاء.
- استخدام `TryParse` هو الطريقة الآمنة لتحويل المدخلات النصية إلى أنواع رقمية.
- الكلمات المفتاحية `ref` و `out` تسمح بتمرير المتغيرات بالمرجع، مما يمكن الدوال من تعديل قيمها الأصلية.
- فهم تاريخ إصدارات .NET و C# يساعد في اختيار التقنيات المناسبة للمشاريع.
Key terms
Test your understanding
- ما هي المسؤولية الرئيسية لكل من Class Loader و Garbage Collector في CLR؟
- كيف يضمن Common Type System (CTS) التوافق بين لغات .NET المختلفة؟
- ما الفرق بين `int.Parse()` و `int.TryParse()` عند تحويل سلسلة نصية إلى عدد صحيح؟
- متى يجب استخدام الكلمة المفتاحية `ref` ومتى يجب استخدام `out` عند تمرير متغير إلى دالة؟
- لماذا يجب تهيئة المتغيرات من أنواع القيم (Value Types) قبل استخدامها في C#؟