كيف تجتاز مقابلة C#: أهم الأسئلة والإجابات
مقابلة مطور C#/.NET هي اختبار لكل من المعرفة النظرية للمنصة والمهارات العملية في كتابة الكود. يريد أصحاب العمل رؤية ليس فقط شخصًا يعرف كيفية كتابة الكود، بل مهندسًا يفهم البنية الداخلية لـ .NET، وإدارة الذاكرة، والبرمجة غير المتزامنة، ومبادئ SOLID.
في هذه المقالة، جمعنا أفضل 10 أسئلة التي تُطرح غالبًا في مقابلات C#. ستتعرف ليس فقط على الإجابات الصحيحة، ولكن أيضًا على المزالق التي ينتبه إليها القائمون على المقابلة. ستكون المادة مفيدة لمطوري junior وكذلك للمتخصصين من مستوى middle.
1. أسئلة حول أساسيات OOP في C#
بدون فهم البرمجة كائنية التوجه، من المستحيل اجتياز مقابلة C#. يختبر القائمون على المقابلة ليس فقط التعريفات، ولكن أيضًا القدرة على تطبيق المبادئ عمليًا.
ما هي مبادئ OOP المطبقة في C#؟
يدعم C# بشكل كامل الأركان الأربعة لـ OOP:
- التغليف (Encapsulation) — إخفاء التنفيذ الداخلي من خلال معدّلات الوصول (
private,protected,internal). - الوراثة (Inheritance) — يمكن للفئة أن ترث السلوك من فئة أساسية واحدة (وراثة فردية).
- تعدد الأشكال (Polymorphism) — القدرة على العمل مع أنواع مختلفة من خلال واجهة موحدة (الطرق الافتراضية، الفئات المجردة).
- التجريد (Abstraction) — استخلاص الخصائص الأساسية للكائن وتجاهل غير الأساسية (الواجهات، الفئات المجردة).
مثال على سؤال: "ما الفرق بين الفئة المجردة والواجهة؟"
هذا سؤال كلاسيكي. الفرق الرئيسي هو أن الواجهة تحدد فقط العقد (تواقيع الطرق بدون تنفيذ)، بينما الفئة المجردة يمكن أن تحتوي على كل من التنفيذ والحالة (الحقول). في C# بدءًا من الإصدار 8.0، يمكن أن تحتوي الواجهات على تنفيذ افتراضي، لكن هذا لا يلغي الفرق المفاهيمي.
// فئة مجردةpublic abstract class Animal{ public string Name { get; set; } public abstract void MakeSound(); // بدون تنفيذ public void Sleep() => Console.WriteLine("Zzz..."); // مع تنفيذ}
// واجهةpublic interface IMovable{ void Move(); // فقط العقد}2. إدارة الذاكرة و Garbage Collector
فهم عمل GC هو علامة على مطور ذي خبرة. غالبًا ما تصبح الأسئلة حول هذا الموضوع مرشحًا بين junior و middle.
كيف يعمل جامع القمامة في .NET؟
يعمل GC في managed heap ويحرر الذاكرة من الكائنات التي لم يعد هناك مراجع لها. يستخدم نموذج الأجيال (Generation 0, 1, 2):
- Gen 0 — الكائنات قصيرة العمر (يتم تنظيفها في أغلب الأحيان).
- Gen 1 — مخزن مؤقت بين Gen 0 و Gen 2.
- Gen 2 — الكائنات طويلة العمر (يتم تنظيفها نادرًا).
مثال على سؤال: "ما هو الإنهاء (Finalization) و IDisposable؟"
يتم استدعاء المُنهي (~ClassName()) بواسطة GC قبل تحرير الذاكرة، لكن وقت استدعائه غير محدد. للتنظيف المحدد للموارد غير المُدارة، يتم استخدام نمط IDisposable:
public class ResourceHolder : IDisposable{ private bool _disposed = false;
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { /* تحرير الموارد المُدارة */ } /* تحرير الموارد غير المُدارة */ _disposed = true; }
~ResourceHolder() => Dispose(false);}3. البرمجة غير المتزامنة: async/await
نادرًا ما تخلو مقابلة C# الحديثة من أسئلة حول البرمجة غير المتزامنة. هذا موضوع رئيسي لـ