يوم من حياة مطور C#: كود، قهوة وسحر .NET

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

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

ابدأ الدورة

مقدمة: أسطورة C# "الميت"

ربما سمعت أن C# هي لغة "الشركات"، حيث كل شيء ممل، بطيء ومغطى بطبقة من البيروقراطية المؤسسية. لكن الحقيقة هي أن مطور C# اليوم هو جندي عالمي في عالم تكنولوجيا المعلومات. يكتب خدمات مصغرة سريعة على ASP.NET Core، ويحسن استعلامات قاعدة البيانات عبر Entity Framework، وأحيانًا يدمج التعلم الآلي باستخدام ML.NET.

في هذه المقالة، لن أتحدث عن نظريات مجردة. سنمر بـ يوم عمل نموذجي لمبرمج C# في شركة حقيقية: من قهوة الصباح إلى دفع الكود إلى الإنتاج. سترى أمثلة على الكود، الأدوات والحيل التي ستوفر ساعات من العمل.



08:30 — الصباح: قهوة، بريد إلكتروني ولوحة المهام

اليوم لا يبدأ بالكود، بل بالسياق. أول شيء أفعله هو فتح Slack و Jira. في الفريق النموذجي، هناك وقفة صباحية (daily stand-up). نجيب فيها على ثلاثة أسئلة:

  • ما الذي تم إنجازه بالأمس؟
  • ماذا سأفعل اليوم؟
  • هل هناك أي عوائق؟

بعد الوقفة الصباحية — نظرة سريعة على طلبات السحب (pull requests) من الزملاء. مراجعة الكود في C# ليست مجرد "علامة اختيار". من المهم هنا التحقق من عدم وجود تسرب للذاكرة (خاصة مع IDisposable) وما إذا تم استخدام async/await بشكل صحيح.



مثال من الحياة الواقعية: مراجعة كود لطريقة غير متزامنة

// سيء: استدعاء حظر داخل طريقة غير متزامنةpublic async Task<User> GetUserAsync(int id){    var user = _context.Users.Find(id); // .Find — متزامن!    return await Task.FromResult(user); // غلاف غير مفيد}

// جيد: غير متزامن بالكاملpublic async Task<User> GetUserAsync(int id){ return await _context.Users.FindAsync(id); // عدم تزامن حقيقي}

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



10:00 — العمل على المهمة: كتابة نقطة نهاية API جديدة

اليوم في قائمة المهام المتراكمة — مهمة "إضافة تصفية المنتجات حسب السعر". هذه قصة نموذجية لـ مطور .NET. أعمل في Visual Studio 2022 مع ReSharper (نعم، إنه بطيء، لكن بدونه لا أستطيع العمل).



الخطوة 1: النموذج و DTO

أولاً، نحدد نموذج البيانات. لنفترض أن لدينا Entity Framework Core وقاعدة بيانات PostgreSQL.

public class Product{    public int Id { get; set; }    public string Name { get; set; }    public decimal Price { get; set; }    public string Category { get; set; }}

public class ProductFilterDto{ public decimal? MinPrice { get; set; } public decimal? MaxPrice { get; set; } public string? Category { get; set; }}


الخطوة 2: المستودع مع IQueryable

الحيلة الرئيسية هي عدم سحب جميع البيانات إلى الذاكرة، بل استخدام IQueryable. هذا يسمح بتشكيل استعلام SQL على جانب قاعدة البيانات.

public async Task<List<Product>> GetFilteredProductsAsync(ProductFilterDto filter){    var query = _context.Products.AsQueryable();

if (filter.MinPrice.HasValue) query = query.Where(p => p.Price >= filter.MinPrice.Value);

if (filter.MaxPrice.HasValue) query = query.Where(p => p.Price <= filter.MaxPrice.Value);

if (!string.IsNullOrEmpty(filter.Category)) query = query.Where(p => p.Category == filter.Category);

return await query.ToListAsync();}

لاحظ: نحن لا نستدعي .ToList() حتى النهاية. هذا نمط أساسي ولكنه بالغ الأهمية لأي مطور C#.



الخطوة 3: وحدة التحكم ASP.NET Core

[ApiController][Route("api/[controller]")]public class ProductsController : ControllerBase{    private readonly IProductRepository _repo;

public ProductsController(IProductRepository repo) =&g

المدونات

توصيات الكتب