مراجعة كود C#: دليل شامل لفحص الكود وأفضل الممارسات

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

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

ابدأ الدورة

مراجعة كود C#: ليست مجرد إجراء شكلي، بل إنقاذ للتطبيق

\n\n

هل سبق لك أن رأيت كودًا يعمل ولكنك تتمنى لو أغمضت عينيك عنه؟ "أرقام سحرية"، حلقات متداخلة، async void و null في غير محله. مراجعة كود C# ليست مجرد إجراء بيروقراطي، بل هي خط الدفاع الأخير قبل أن يصل الخلل إلى الإنتاج. أو الأسوأ من ذلك، قبل أن يضطر زملاؤك إلى صيانة هذا الكود وهم يلعنون كاتبه.

\n\n

في هذه المقالة، سنستعرض ما يجب التركيز عليه حقًا عند مراجعة كود C#. لا ماء، فقط حالات عملية، أنماط سيئة وأمثلة. إذا كنت مطورًا مبتدئًا، فهذه قائمة فحصك. وإذا كنت خبيرًا، فجدّد معلوماتك. هيا بنا.

\n\n

1. Null: العدو الأكبر لمطور C#

\n\n

استثناء NullReferenceException الشهير هو سبب ملايين ليالي الأرق. أول ما نفحصه في مراجعة الكود: الحماية من null.

\n\n

ما الذي يجب أن يثير الشك؟

\n
    \n
  • عدم وجود فحص لـ null قبل الوصول إلى الخصائص.
  • \n
  • إرجاع null من دوال يُتوقع منها إرجاع مجموعة.
  • \n
  • تجاهل سياقات nullable (#nullable enable).
  • \n
\n\n

مثال سيء:

\n
public string GetUserName(User user)\n{\n    return user.Name.ToUpper(); // user قد يكون null!
\n\n

مثال جيد (C# 8+):

\n
public string GetUserName(User? user)\n{\n    return user?.Name?.ToUpper() ?? "غير معروف";\n}
\n\n

نصيحة لمراجعة الكود: اطلب تفعيل Nullable في المشاريع الجديدة. هذا ليس مجرد موضة، بل ينقذك من أخطاء سخيفة. مراجعة كود C# بدون فحص nullable كالقيادة بدون حزام أمان.

\n\n

2. البرمجة غير المتزامنة: async/await بدون أخطاء

\n\n

البرمجة غير المتزامنة في C# أداة قوية، لكن استخدامها الخاطئ يحولها إلى قنبلة موقوتة. في المراجعة، نفحص ثلاثة أخطاء رئيسية.

\n\n

الخطأ الأول: async void

\n

لا يمكن تتبع دوال async void — الاستثناء سينتقل إلى الخيط الرئيسي ويقتل العملية. مسموح بها فقط لمعالجات الأحداث (مثل أزرار WinForms).

\n\n

مثال سيء:

\n
public async void LoadDataAsync()\n{\n    var data = await _service.GetDataAsync(); // الخطأ سيقتل العملية\n}
\n\n

مثال جيد:

\n
public async Task LoadDataAsync()\n{\n    var data = await _service.GetDataAsync();\n}
\n\n

الخطأ الثاني: حظر الكود غير المتزامن

\n

استخدام .Result أو .Wait() في سياق غير متزامن هو طريق مؤكد للتوقف التام (deadlock).

\n\n

مثال سيء:

\n
var result = _service.GetDataAsync().Result; // deadlock في تطبيقات الواجهة
\n\n

مثال جيد:

\n
var result = await _service.GetDataAsync();
\n\n

الخطأ الثالث: عدم وجود CancellationToken

\n

يجب أن تكون العمليات الطويلة قابلة للإلغاء. إذا لم تحتوِ دالة على CancellationToken، اسأل الكاتب: "ماذا سيحدث إذا أغلق المستخدم الصفحة؟"

\n\n

3. LINQ: جمال أم موت بطيء؟

\n\n

LINQ أنيق. لكن مراجعة الكود غالبًا ما تكشف أن وراء هذا الأناقة O(n²) أو مرور متعدد على المجموعة.

\n\n

أخطاء شائعة في مراجعة كود C# مع LINQ:

\n
    \n
  • المرور المتعدد: استخدام .Count() > 0 ثم .First() — مروران. استخدم .Any() و .FirstOrDefault().
  • \n
  • نسيان ToList(): التحميل الكسول قد يؤدي إلى تنفيذ الاستعلام بعد إغلاق DataReader.
  • \n
  • Where + Select = تكرار: إذا كان يمكن استخدام SelectMany واحد، فاستخدمه.
  • \n
\n\n

مثال يجب أن يثير علامة حمراء:

\n
var result = l                

المدونات

توصيات الكتب