C#: مشروع شامل: مدير المهام

1. تحليل المتطلبات

سنقوم بإنشاء مدير مهام يعمل عبر سطر الأوامر يدعم الميزات التالية:

تنقسم هذه الوظيفة إلى سبع خطوات، يتم تنفيذها بشكل تدريجي.


2. تصميم الفئات: القوائم المنسقة ونماذج البيانات

أولاً، قم بتعريف قائمة الترتيب «priority» وفئة كيان «task».

▶ مثال

CSHARP
enum Priority
{
    Low,
    Medium,
    High
}

class Task
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public Priority Priority { get; set; }
    public bool IsCompleted { get; set; }
    public DateTime CreatedAt { get; set; }

    public Task(int id, string title, string description, Priority priority)
    {
        Id = id;
        Title = title;
        Description = description;
        Priority = priority;
        IsCompleted = false;
        CreatedAt = DateTime.Now;
    }

    public override string ToString()
    {
        string status = IsCompleted ? "[x]" : "[ ]";
        return $"{Id,-3} {status} {Priority,-6} {CreatedAt:yyyy-MM-dd} {Title}";
    }
}
▶ جرّب الكود

3. تخزين المجموعات: TaskManager وعمليات CRUD

استخدم List<Task> لتخزين المهام وتنفيذ العمليات الأساسية مثل الإنشاء والقراءة والتحديث والحذف.

▶ مثال

CSHARP
class TaskManager
{
    private List<Task> tasks = new List<Task>();
    private int nextId = 1;

    public Task AddTask(string title, string description, Priority priority)
    {
        Task task = new Task(nextId++, title, description, priority);
        tasks.Add(task);
        return task;
    }

    public bool RemoveTask(int id)
    {
        Task task = tasks.Find(t => t.Id == id);
        if (task != null)
        {
            tasks.Remove(task);
            return true;
        }
        return false;
    }

    public bool CompleteTask(int id)
    {
        Task task = tasks.Find(t => t.Id == id);
        if (task != null)
        {
            task.IsCompleted = true;
            return true;
        }
        return false;
    }

    public List<Task> GetAllTasks()
    {
        return new List<Task>(tasks);
    }

    public void SortByPriority()
    {
        tasks.Sort((a, b) => b.Priority.CompareTo(a.Priority));
    }
}
▶ جرّب الكود

4. استدامة الملفات: تسلسل JSON وإلغاء تسلسل JSON

استخدم System.Text.Json لحفظ قائمة المهام في ملف واستعادتها لاحقًا.

▶ مثال

CSHARP 📖 للعرض فقط
using System.Text.Json;

class TaskManager
{
    private List<Task> tasks = new List<Task>();
    private int nextId = 1;
    private const string FilePath = "tasks.json";
    private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions
    {
        WriteIndented = true
    };

    public string SaveToFile()
    {
        try
        {
            string json = JsonSerializer.Serialize(tasks, jsonOptions);
            File.WriteAllText(FilePath, json);
            return "Save succeeded.";
        }
        catch (Exception ex)
        {
            return $"Save failed: {ex.Message}";
        }
    }

    public string LoadFromFile()
    {
        try
        {
            if (!File.Exists(FilePath))
            {
                return "File does not exist, skipping load.";
            }
            string json = File.ReadAllText(FilePath);
            List<Task>? loaded = JsonSerializer.Deserialize<List<Task>>(json);
            if (loaded != null)
            {
                tasks = loaded;
                nextId = tasks.Count > 0 ? tasks.Max(t => t.Id) + 1 : 1;
            }
            return "Load succeeded.";
        }
        catch (JsonException ex)
        {
            return $"JSON format error: {ex.Message}";
        }
        catch (Exception ex)
        {
            return $"Load failed: {ex.Message}";
        }
    }
}
50 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)

5. استعلامات LINQ: التصفية والتجميع

استخدم LINQ لتنفيذ عملية التصفية حسب الأولوية، والاستعلام عن المهام المعلقة، وإنشاء الإحصائيات.

▶ مثال

CSHARP
class TaskManager
{
    private List<Task> tasks = new List<Task>();

    public List<Task> FilterByPriority(Priority priority)
    {
        return tasks.Where(t => t.Priority == priority).ToList();
    }

    public List<Task> GetPendingTasks()
    {
        return tasks.Where(t => !t.IsCompleted)
                    .OrderByDescending(t => t.Priority)
                    .ToList();
    }

    public Dictionary<Priority, int> GetStatistics()
    {
        return tasks.GroupBy(t => t.Priority)
                    .ToDictionary(g => g.Key, g => g.Count());
    }

    public int GetCompletedCount()
    {
        return tasks.Count(t => t.IsCompleted);
    }

    public int GetPendingCount()
    {
        return tasks.Count(t => !t.IsCompleted);
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Sample statistics output:
High: 2, Medium: 3, Low: 1
Completed: 1, Pending: 5

6. حفظ الملفات بشكل غير متزامن

استخدم async/await لتنفيذ عمليات كتابة الملفات غير المعطلة.

▶ مثال

CSHARP 📖 للعرض فقط
class TaskManager
{
    private List<Task> tasks = new List<Task>();
    private const string FilePath = "tasks.json";
    private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions
    {
        WriteIndented = true
    };

    public async Task````<string>```` SaveToFileAsync()
    {
        try
        {
            string json = JsonSerializer.Serialize(tasks, jsonOptions);
            await File.WriteAllTextAsync(FilePath, json);
            return "Async save succeeded.";
        }
        catch (UnauthorizedAccessException ex)
        {
            return $"File access denied: {ex.Message}";
        }
        catch (IOException ex)
        {
            return $"IO error: {ex.Message}";
        }
        catch (Exception ex)
        {
            return $"Async save failed: {ex.Message}";
        }
    }

    public async Task````<string>```` LoadFromFileAsync()
    {
        try
        {
            if (!File.Exists(FilePath))
            {
                return "File does not exist, skipping load.";
            }
            string json = await File.ReadAllTextAsync(FilePath);
            List<Task>? loaded = JsonSerializer.Deserialize<List<Task>>(json);
            if (loaded != null)
            {
                tasks = loaded;
                nextId = tasks.Count > 0 ? tasks.Max(t => t.Id) + 1 : 1;
            }
            return "Async load succeeded.";
        }
        catch (JsonException ex)
        {
            return $"JSON format error: {ex.Message}";
        }
        catch (Exception ex)
        {
            return $"Async load failed: {ex.Message}";
        }
    }
}
56 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)

7. واجهة تفاعلية لسطر الأوامر

استخدم عبارة switch لإنشاء حلقة قائمة في سطر الأوامر.

▶ مثال

CSHARP 📖 للعرض فقط
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        TaskManager manager = new TaskManager();
        string loadResult = await manager.LoadFromFileAsync();
        Console.WriteLine(loadResult);

        while (true)
        {
            Console.WriteLine("\n===== Task Manager =====");
            Console.WriteLine("1. Add task");
            Console.WriteLine("2. Delete task");
            Console.WriteLine("3. Complete task");
            Console.WriteLine("4. List all tasks");
            Console.WriteLine("5. Filter by priority");
            Console.WriteLine("6. View statistics");
            Console.WriteLine("7. Save to file");
            Console.WriteLine("0. Exit");
            Console.Write("Select: ");
            string? input = Console.ReadLine();

            switch (input)
            {
                case "1":
                    Console.Write("Title: ");
                    string? title = Console.ReadLine() ?? "";
                    Console.Write("Description: ");
                    string? desc = Console.ReadLine() ?? "";
                    Console.Write("Priority (Low/Medium/High): ");
                    string? priStr = Console.ReadLine();
                    if (Enum.TryParse<Priority>(priStr, true, out Priority pri))
                    {
                        Task added = manager.AddTask(title, desc, pri);
                        Console.WriteLine($"Added: {added}");
                    }
                    else
                    {
                        Console.WriteLine("Invalid priority.");
                    }
                    break;
                case "2":
                    Console.Write("Task ID: ");
                    if (int.TryParse(Console.ReadLine(), out int delId))
                    {
                        Console.WriteLine(manager.RemoveTask(delId) ? "Deleted." : "Not found.");
                    }
                    break;
                case "3":
                    Console.Write("Task ID: ");
                    if (int.TryParse(Console.ReadLine(), out int compId))
                    {
                        Console.WriteLine(manager.CompleteTask(compId) ? "Completed." : "Not found.");
                    }
                    break;
                case "4":
                    manager.SortByPriority();
                    foreach (Task t in manager.GetAllTasks())
                    {
                        Console.WriteLine(t);
                    }
                    break;
                case "5":
                    Console.Write("Priority (Low/Medium/High): ");
                    if (Enum.TryParse<Priority>(Console.ReadLine(), true, out Priority filterPri))
                    {
                        foreach (Task t in manager.FilterByPriority(filterPri))
                        {
                            Console.WriteLine(t);
                        }
                    }
                    break;
                case "6":
                    Dictionary<Priority, int> stats = manager.GetStatistics();
                    foreach (var kv in stats)
                    {
                        Console.WriteLine($"{kv.Key}: {kv.Value}");
                    }
                    Console.WriteLine($"Completed: {manager.GetCompletedCount()}, Pending: {manager.GetPendingCount()}");
                    break;
                case "7":
                    string saveResult = await manager.SaveToFileAsync();
                    Console.WriteLine(saveResult);
                    break;
                case "0":
                    string finalSave = await manager.SaveToFileAsync();
                    Console.WriteLine(finalSave);
                    Console.WriteLine("Goodbye!");
                    return;
                default:
                    Console.WriteLine("Invalid selection.");
                    break;
            }
        }
    }
}
96 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)
TEXT 📖 للعرض فقط
===== Task Manager =====
1. Add task
2. Delete task
3. Complete task
4. List all tasks
5. Filter by priority
6. View statistics
7. Save to file
0. Exit
Select: 1
Title: Learn C#
Description: Complete lesson 36
Priority (Low/Medium/High): High
Added: 1   [ ] High   2026-06-28 Learn C#

8. تنظيم هيكل المشروع

استخدم مساحات الأسماء وusing لتنظيم الكود، مع وضع المهام المختلفة في ملفات منفصلة.

▶ مثال

هيكل ملف المشروع:

TEXT 📖 للعرض فقط
TaskManagerApp/
├── Models/
│   ├── Priority.cs
│   └── Task.cs
├── Services/
│   └── TaskManager.cs
└── Program.cs

Priority.cs:

CSHARP
namespace TaskManagerApp.Models
{
    public enum Priority
    {
        Low,
        Medium,
        High
    }
}

Task.cs:

CSHARP
using System;

namespace TaskManagerApp.Models
{
    public class Task
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public Priority Priority { get; set; }
        public bool IsCompleted { get; set; }
        public DateTime CreatedAt { get; set; }

        public Task(int id, string title, string description, Priority priority)
        {
            Id = id;
            Title = title;
            Description = description;
            Priority = priority;
            IsCompleted = false;
            CreatedAt = DateTime.Now;
        }

        public override string ToString()
        {
            string status = IsCompleted ? "[x]" : "[ ]";
            return $"{Id,-3} {status} {Priority,-6} {CreatedAt:yyyy-MM-dd} {Title}";
        }
    }
}

TaskManager.cs:

CSHARP
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using TaskManagerApp.Models;

namespace TaskManagerApp.Services
{
    public class TaskManager
    {
        private List<Models.Task> tasks = new List<Models.Task>();
        private int nextId = 1;
        private const string FilePath = "tasks.json";
        private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions
        {
            WriteIndented = true
        };

        public Models.Task AddTask(string title, string description, Priority priority)
        {
            Models.Task task = new Models.Task(nextId++, title, description, priority);
            tasks.Add(task);
            return task;
        }

        public bool RemoveTask(int id)
        {
            Models.Task? task = tasks.Find(t => t.Id == id);
            if (task != null)
            {
                tasks.Remove(task);
                return true;
            }
            return false;
        }

        public bool CompleteTask(int id)
        {
            Models.Task? task = tasks.Find(t => t.Id == id);
            if (task != null)
            {
                task.IsCompleted = true;
                return true;
            }
            return false;
        }

        public List<Models.Task> GetAllTasks()
        {
            return new List<Models.Task>(tasks);
        }

        public void SortByPriority()
        {
            tasks.Sort((a, b) => b.Priority.CompareTo(a.Priority));
        }

        public List<Models.Task> FilterByPriority(Priority priority)
        {
            return tasks.Where(t => t.Priority == priority).ToList();
        }

        public List<Models.Task> GetPendingTasks()
        {
            return tasks.Where(t => !t.IsCompleted)
                        .OrderByDescending(t => t.Priority)
                        .ToList();
        }

        public Dictionary<Priority, int> GetStatistics()
        {
            return tasks.GroupBy(t => t.Priority)
                        .ToDictionary(g => g.Key, g => g.Count());
        }

        public int GetCompletedCount()
        {
            return tasks.Count(t => t.IsCompleted);
        }

        public int GetPendingCount()
        {
            return tasks.Count(t => !t.IsCompleted);
        }

        public async Task````<string>```` SaveToFileAsync()
        {
            try
            {
                string json = JsonSerializer.Serialize(tasks, jsonOptions);
                await File.WriteAllTextAsync(FilePath, json);
                return "Save succeeded.";
            }
            catch (UnauthorizedAccessException ex)
            {
                return $"Access denied: {ex.Message}";
            }
            catch (IOException ex)
            {
                return $"IO error: {ex.Message}";
            }
            catch (Exception ex)
            {
                return $"Save failed: {ex.Message}";
            }
        }

        public async Task````<string>```` LoadFromFileAsync()
        {
            try
            {
                if (!File.Exists(FilePath))
                {
                    return "File does not exist, skipping load.";
                }
                string json = await File.ReadAllTextAsync(FilePath);
                List<Models.Task>? loaded = JsonSerializer.Deserialize<List<Models.Task>>(json);
                if (loaded != null)
                {
                    tasks = loaded;
                    nextId = tasks.Count > 0 ? tasks.Max(t => t.Id) + 1 : 1;
                }
                return "Load succeeded.";
            }
            catch (JsonException ex)
            {
                return $"JSON format error: {ex.Message}";
            }
            catch (Exception ex)
            {
                return $"Load failed: {ex.Message}";
            }
        }
    }
}

Program.cs:

CSHARP
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TaskManagerApp.Models;
using TaskManagerApp.Services;

namespace TaskManagerApp
{
    class Program
    {
        static async Task Main()
        {
            TaskManager manager = new TaskManager();
            string loadResult = await manager.LoadFromFileAsync();
            Console.WriteLine(loadResult);

            while (true)
            {
                Console.WriteLine("\n===== Task Manager =====");
                Console.WriteLine("1. Add task");
                Console.WriteLine("2. Delete task");
                Console.WriteLine("3. Complete task");
                Console.WriteLine("4. List all tasks");
                Console.WriteLine("5. Filter by priority");
                Console.WriteLine("6. View statistics");
                Console.WriteLine("7. Save to file");
                Console.WriteLine("0. Exit");
                Console.Write("Select: ");
                string? input = Console.ReadLine();

                switch (input)
                {
                    case "1":
                        Console.Write("Title: ");
                        string? title = Console.ReadLine() ?? "";
                        Console.Write("Description: ");
                        string? desc = Console.ReadLine() ?? "";
                        Console.Write("Priority (Low/Medium/High): ");
                        string? priStr = Console.ReadLine();
                        if (Enum.TryParse<Priority>(priStr, true, out Priority pri))
                        {
                            Models.Task added = manager.AddTask(title, desc, pri);
                            Console.WriteLine($"Added: {added}");
                        }
                        else
                        {
                            Console.WriteLine("Invalid priority.");
                        }
                        break;
                    case "2":
                        Console.Write("Task ID: ");
                        if (int.TryParse(Console.ReadLine(), out int delId))
                        {
                            Console.WriteLine(manager.RemoveTask(delId) ? "Deleted." : "Not found.");
                        }
                        break;
                    case "3":
                        Console.Write("Task ID: ");
                        if (int.TryParse(Console.ReadLine(), out int compId))
                        {
                            Console.WriteLine(manager.CompleteTask(compId) ? "Completed." : "Not found.");
                        }
                        break;
                    case "4":
                        manager.SortByPriority();
                        foreach (Models.Task t in manager.GetAllTasks())
                        {
                            Console.WriteLine(t);
                        }
                        break;
                    case "5":
                        Console.Write("Priority (Low/Medium/High): ");
                        if (Enum.TryParse<Priority>(Console.ReadLine(), true, out Priority filterPri))
                        {
                            foreach (Models.Task t in manager.FilterByPriority(filterPri))
                            {
                                Console.WriteLine(t);
                            }
                        }
                        break;
                    case "6":
                        Dictionary<Priority, int> stats = manager.GetStatistics();
                        foreach (var kv in stats)
                        {
                            Console.WriteLine($"{kv.Key}: {kv.Value}");
                        }
                        Console.WriteLine($"Completed: {manager.GetCompletedCount()}, Pending: {manager.GetPendingCount()}");
                        break;
                    case "7":
                        string saveResult = await manager.SaveToFileAsync();
                        Console.WriteLine(saveResult);
                        break;
                    case "0":
                        string finalSave = await manager.SaveToFileAsync();
                        Console.WriteLine(finalSave);
                        Console.WriteLine("Goodbye!");
                        return;
                    default:
                        Console.WriteLine("Invalid selection.");
                        break;
                }
            }
        }
    }
}

9. النسخة الكاملة في ملف واحد

ادمج كل الأكواد في ملف واحد قابل للتحويل البرمجي من أجل إجراء اختبار سريع.

▶ مثال

CSHARP 📖 للعرض فقط
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;

enum Priority
{
    Low,
    Medium,
    High
}

class Task
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public Priority Priority { get; set; }
    public bool IsCompleted { get; set; }
    public DateTime CreatedAt { get; set; }

    public Task(int id, string title, string description, Priority priority)
    {
        Id = id;
        Title = title;
        Description = description;
        Priority = priority;
        IsCompleted = false;
        CreatedAt = DateTime.Now;
    }

    public override string ToString()
    {
        string status = IsCompleted ? "[x]" : "[ ]";
        return $"{Id,-3} {status} {Priority,-6} {CreatedAt:yyyy-MM-dd} {Title}";
    }
}

class TaskManager
{
    private List<Task> tasks = new List<Task>();
    private int nextId = 1;
    private const string FilePath = "tasks.json";
    private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions
    {
        WriteIndented = true
    };

    public Task AddTask(string title, string description, Priority priority)
    {
        Task task = new Task(nextId++, title, description, priority);
        tasks.Add(task);
        return task;
    }

    public bool RemoveTask(int id)
    {
        Task? task = tasks.Find(t => t.Id == id);
        if (task != null)
        {
            tasks.Remove(task);
            return true;
        }
        return false;
    }

    public bool CompleteTask(int id)
    {
        Task? task = tasks.Find(t => t.Id == id);
        if (task != null)
        {
            task.IsCompleted = true;
            return true;
        }
        return false;
    }

    public List<Task> GetAllTasks()
    {
        return new List<Task>(tasks);
    }

    public void SortByPriority()
    {
        tasks.Sort((a, b) => b.Priority.CompareTo(a.Priority));
    }

    public List<Task> FilterByPriority(Priority priority)
    {
        return tasks.Where(t => t.Priority == priority).ToList();
    }

    public List<Task> GetPendingTasks()
    {
        return tasks.Where(t => !t.IsCompleted)
                    .OrderByDescending(t => t.Priority)
                    .ToList();
    }

    public Dictionary<Priority, int> GetStatistics()
    {
        return tasks.GroupBy(t => t.Priority)
                    .ToDictionary(g => g.Key, g => g.Count());
    }

    public int GetCompletedCount()
    {
        return tasks.Count(t => t.IsCompleted);
    }

    public int GetPendingCount()
    {
        return tasks.Count(t => !t.IsCompleted);
    }

    public async Task````<string>```` SaveToFileAsync()
    {
        try
        {
            string json = JsonSerializer.Serialize(tasks, jsonOptions);
            await File.WriteAllTextAsync(FilePath, json);
            return "Save succeeded.";
        }
        catch (UnauthorizedAccessException ex)
        {
            return $"Access denied: {ex.Message}";
        }
        catch (IOException ex)
        {
            return $"IO error: {ex.Message}";
        }
        catch (Exception ex)
        {
            return $"Save failed: {ex.Message}";
        }
    }

    public async Task````<string>```` LoadFromFileAsync()
    {
        try
        {
            if (!File.Exists(FilePath))
            {
                return "File does not exist, skipping load.";
            }
            string json = await File.ReadAllTextAsync(FilePath);
            List<Task>? loaded = JsonSerializer.Deserialize<List<Task>>(json);
            if (loaded != null)
            {
                tasks = loaded;
                nextId = tasks.Count > 0 ? tasks.Max(t => t.Id) + 1 : 1;
            }
            return "Load succeeded.";
        }
        catch (JsonException ex)
        {
            return $"JSON format error: {ex.Message}";
        }
        catch (Exception ex)
        {
            return $"Load failed: {ex.Message}";
        }
    }
}

class Program
{
    static async Task Main()
    {
        TaskManager manager = new TaskManager();
        string loadResult = await manager.LoadFromFileAsync();
        Console.WriteLine(loadResult);

        while (true)
        {
            Console.WriteLine("\n===== Task Manager =====");
            Console.WriteLine("1. Add task");
            Console.WriteLine("2. Delete task");
            Console.WriteLine("3. Complete task");
            Console.WriteLine("4. List all tasks");
            Console.WriteLine("5. Filter by priority");
            Console.WriteLine("6. View statistics");
            Console.WriteLine("7. Save to file");
            Console.WriteLine("0. Exit");
            Console.Write("Select: ");
            string? input = Console.ReadLine();

            switch (input)
            {
                case "1":
                    Console.Write("Title: ");
                    string? title = Console.ReadLine() ?? "";
                    Console.Write("Description: ");
                    string? desc = Console.ReadLine() ?? "";
                    Console.Write("Priority (Low/Medium/High): ");
                    string? priStr = Console.ReadLine();
                    if (Enum.TryParse<Priority>(priStr, true, out Priority pri))
                    {
                        Task added = manager.AddTask(title, desc, pri);
                        Console.WriteLine($"Added: {added}");
                    }
                    else
                    {
                        Console.WriteLine("Invalid priority.");
                    }
                    break;
                case "2":
                    Console.Write("Task ID: ");
                    if (int.TryParse(Console.ReadLine(), out int delId))
                    {
                        Console.WriteLine(manager.RemoveTask(delId) ? "Deleted." : "Not found.");
                    }
                    break;
                case "3":
                    Console.Write("Task ID: ");
                    if (int.TryParse(Console.ReadLine(), out int compId))
                    {
                        Console.WriteLine(manager.CompleteTask(compId) ? "Completed." : "Not found.");
                    }
                    break;
                case "4":
                    manager.SortByPriority();
                    foreach (Task t in manager.GetAllTasks())
                    {
                        Console.WriteLine(t);
                    }
                    break;
                case "5":
                    Console.Write("Priority (Low/Medium/High): ");
                    if (Enum.TryParse<Priority>(Console.ReadLine(), true, out Priority filterPri))
                    {
                        foreach (Task t in manager.FilterByPriority(filterPri))
                        {
                            Console.WriteLine(t);
                        }
                    }
                    break;
                case "6":
                    Dictionary<Priority, int> stats = manager.GetStatistics();
                    foreach (var kv in stats)
                    {
                        Console.WriteLine($"{kv.Key}: {kv.Value}");
                    }
                    Console.WriteLine($"Completed: {manager.GetCompletedCount()}, Pending: {manager.GetPendingCount()}");
                    break;
                case "7":
                    string saveResult = await manager.SaveToFileAsync();
                    Console.WriteLine(saveResult);
                    break;
                case "0":
                    string finalSave = await manager.SaveToFileAsync();
                    Console.WriteLine(finalSave);
                    Console.WriteLine("Goodbye!");
                    return;
                default:
                    Console.WriteLine("Invalid selection.");
                    break;
            }
        }
    }
}
243 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)
TEXT 📖 للعرض فقط
Load succeeded.

===== Task Manager =====
1. Add task
2. Delete task
3. Complete task
4. List all tasks
5. Filter by priority
6. View statistics
7. Save to file
0. Exit
Select: 1
Title: Learn C#
Description: Complete lesson 36
Priority (Low/Medium/High): High
Added: 1   [ ] High   2026-06-28 Learn C#

Select: 1
Title: Write documentation
Description: Organize project docs
Priority (Low/Medium/High): Medium
Added: 2   [ ] Medium 2026-06-28 Write documentation

Select: 3
Task ID: 2
Completed.

Select: 4
2   [x] Medium 2026-06-28 Write documentation
1   [ ] High   2026-06-28 Learn C#

Select: 6
High: 1
Medium: 1
Completed: 1, Pending: 1

Select: 0
Save succeeded.
Goodbye!

❓ أسئلة شائعة

س لماذا يتطلب التسلسل وجود مُنشئ بدون معلمات؟
ج تتطلب مكتبة System.Text.Json وجود مُنشئ بدون معلمات بشكل افتراضي؛ ويمكنك تجاوز ذلك عن طريق تخصيص مُحول باستخدام JsonSerializerOptions.
س ماذا يحدث عندما لا تعثر دالة List.Find على عنصر ما؟
ج تُرجع دالة Find القيمة null دون إثارة استثناء؛ لذا يجب دائمًا التحقق من عدم وجود القيمة null قبل استخدام النتيجة.
س ماذا يحدث إذا كانت الدالة غير المتزامنة تفتقر إلى كلمة await؟
ج تصبح المهمة من نوع «التشغيل دون متابعة» — ولن يتم التقاط الاستثناءات، مما قد يؤدي إلى فقدان البيانات.
س ما الذي ترجعه الدالة Enum.TryParse في حالة الفشل؟
ج ترجع القيمة false، وتحتفظ المعلمة الناتجة بقيمتها الافتراضية، ولا يتم إلقاء أي استثناء.

📖 ملخص

📝 تمارين

  1. أضف خاصية «DueDate» إلى فئة «Task» وقم بتنفيذ ميزة «عرض المهام المتأخرة»
  2. أضف طريقة EditTask إلى TaskManager تتيح تعديل العنوان والوصف
  3. قم بتغيير تنسيق الحفظ من JSON إلى CSV، مع تطبيق منطق التسلسل الخاص بك
  4. إضافة ميزة الفرز حسب تاريخ الإنشاء والبحث حسب العنوان
  5. تنفيذ وضع معلمات سطر الأوامر: يقوم البرنامج بتنفيذ عملية عبر المعلمات عند بدء التشغيل ثم ينهي عمله
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%