كيف تجتاز مقابلة C#: دليل كامل مع أمثلة برمجية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا مقابلة C# ليست امتحانًا بل حوارًا

\n\n

تخيل: أنت تجلس أمام قائد فريق أو مطور كبير. إنه ينظر إليك ليس كعدو، بل كزميل مستقبلي. لكن في رأسك ضباب، ويداك تتعرقان، وعند السؤال عن IDisposable تنسى فجأة ما هو. هل هذا مألوف؟

\n\n

مقابلة C# ليست اختبارًا مدرسيًا حيث تحتاج فقط إلى "تخمين الحرف". إنها اختبار لتفكيرك الهندسي، وقدرتك على التفكير المنطقي، وبالطبع معرفتك الأساسية بمنصة .NET. في هذه المقالة، سنناقش المواضيع الرئيسية التي تُطرح فعليًا في المقابلات (تلميح: 80% من الأسئلة تتكرر مرارًا وتكرارًا).

\n\n

الأساسيات التي يجب أن تحفظها عن ظهر قلب

\n\n

إذا كنت ذاهبًا إلى مقابلة بعد ساعة وليس لديك وقت للتحضير - اقرأ هذا القسم. إنه "خبز" مطور C#. بدون هذه المعرفة، لن يتم توظيفك حتى كمبتدئ.

\n\n

1. أنواع البيانات: Value vs Reference

\n\n

هذا هو السؤال الأكثر شيوعًا على الأرجح. المحاور لا يريد سماع "int هو نوع قيمي، class هو نوع مرجعي" فقط. من المهم أن يفهم كيف يعمل هذا تحت الغطاء.

\n\n
// مثال يُعطى غالبًا في المقابلات\nstruct Point {\n    public int X;\n    public int Y;\n}\n\nclass PointClass {\n    public int X;\n    public int Y;\n}\n\nvoid Main() {\n    Point p1 = new Point { X = 10, Y = 20 };\n    Point p2 = p1;\n    p2.X = 999;\n    Console.WriteLine(p1.X); // 10 — نسخة\n\n    PointClass pc1 = new PointClass { X = 10, Y = 20 };\n    PointClass pc2 = pc1;\n    pc2.X = 999;\n    Console.WriteLine(pc1.X); // 999 — مرجع\n}
\n\n

النقطة الأساسية: struct يُنسخ بالكامل، class يُمرر كمرجع. ونعم، string هو نوع مرجعي، لكنه يتصرف كنوع قيمي بسبب عدم قابليته للتغيير. هذا أيضًا يُسأل عنه كثيرًا.

\n\n

2. Boxing و Unboxing

\n\n

موضوع بسيط، لكنهم يحبونه. تخيل أنك تضع نوعًا قيميًا (int) في object. يحدث boxing. عندما تستعيده - يحدث unboxing. هذا مكلف من حيث الأداء.

\n\n
int number = 42;\nobject boxed = number; // boxing\nint unboxed = (int)boxed; // unboxing
\n\n

في المشاريع الحديثة، هذا نادر، لكن معرفة الآلية تظهر أنك تفهم كيف يدير .NET الذاكرة.

\n\n

3. الواجهات والفئات المجردة

\n\n

سؤال كلاسيكي: "متى تستخدم interface ومتى تستخدم abstract class؟"

\n\n
    \n
  • الواجهة (Interface) — عقد. إذا كان لديك فئات مختلفة يجب أن تكون قادرة على فعل الشيء نفسه (مثل الطيران: طائرة، طائر، طائرة بدون طيار).
  • \n
  • الفئة المجردة (Abstract Class) — تنفيذ أساسي. إذا كانت الفئات تشترك في منطق مشترك (مثل جميع الحيوانات تتنفس، لكن بطرق مختلفة).
  • \n
\n\n
public interface IFlyable {\n    void Fly();\n}\n\npublic abstract class Animal {\n    public abstract void MakeSound();\n    public void Breathe() => Console.WriteLine("شهيق-زفير");\n}
\n\n

في C# 8.0+، أصبح للواجهات تنفيذ افتراضي، لكن في المقابلة من الأفضل التحدث عن النهج الكلاسيكي.

\n\n

أسئلة متقدمة: أين المكمن

\n\n

عندما يتم تجاوز الأساسيات، يبدأ المحاور في "الحفر أعمق". إليك المواضيع التي تسبب الذهول غالبًا.

\n\n

4. Async/Await والخيوط

\n\n

كثيرون يخلطون بين عدم التزامن وتعدد الخيوط. تذكر: async/await يتعلق بتحرير الخيط، وليس بإنشاء خيط جديد.

\n\n
public async Task<string> GetDataAsync() {\n    using HttpClient client = new HttpClient();\n    // يتم تحرير الخيط أثناء انتظار الرد\n    string result = await client.GetStringAsync("https://example.com");\n    return result;\n}
\n\n

غالبًا ما يُسأل عن ConfigureAwait(false). الإجابة: هذا ضروري لعدم العودة إلى سياق التزامن الأصلي (مثل خيط واجهة المستخدم في WPF). في المكتبات - استخدمه دائمًا، في التطبيقات - بحذر.

\n\n

5. LINQ: من البسيط

المدونات

توصيات الكتب