C#: مساحات الأسماء واستخدامها

1. ما هو مجال الأسماء؟

مساحة الأسماء هي آلية تجميع منطقية تُستخدم لتنظيم الكود وتجنب تعارضات أسماء الأنواع. في المشاريع الكبيرة، قد تُعرِّف وحدات مختلفة فئات تحمل الاسم نفسه؛ وتوفر مساحات الأسماء مسارًا مُحدَّدًا للأنواع.


2. تعريف مساحة الاسم

استخدم الكلمة الرئيسية namespace لإعلان مساحة اسم، مع وضع الأنواع داخل الأقواس المتعرجة.

▶ مثال

CSHARP
namespace MyApp.Models
{
    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

namespace MyApp.Services
{
    public class UserService
    {
        public string GetInfo()
        {
            return "UserService is ready";
        }
    }
}
▶ جرّب الكود

3. تداخل مساحات الأسماء

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

▶ مثال

CSHARP
namespace Company
{
    namespace Products
    {
        namespace Electronics
        {
            public class Phone
            {
                public string Model { get; set; }
            }
        }
    }
}

namespace Company.Products.Electronics
{
    public class Tablet
    {
        public string Model { get; set; }
    }
}
▶ جرّب الكود

ينتمي كل من Company.Products.Electronics.Phone وCompany.Products.Electronics.Tablet إلى نفس مساحة الأسماء.


4. مساحات الأسماء على مستوى الملف (C# 10)

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

▶ مثال

CSHARP
namespace MyApp.Services;

public class EmailService
{
    public void Send(string to)
    {
        System.Console.WriteLine($"Sending email to {to}");
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Sending email to user@example.com

5. استخدام التوجيه

تقوم التوجيهية using باستيراد مساحة أسماء، مما يتيح لك استخدام أنواعها مباشرةً دون الحاجة إلى كتابة الاسم الكامل.

▶ مثال

CSHARP
using System;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("No need for System.Console");
            Console.WriteLine(DateTime.Now.Year);
        }
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
No need for System.Console
2026

6. استخدام الاسم المستعار

عندما يكون اسم الفضاء طويلاً جدًّا أو في حالة وجود تعارضات في أسماء الأنواع، يمكنك استخدام using ... = ... لإنشاء اسم مستعار.

▶ مثال

CSHARP
using Dict = System.Collections.Generic.Dictionary`<string, int>`;
using StringBuilder = System.Text.StringBuilder;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            Dict scores = new Dict();
            scores.Add("Alice", 95);
            scores.Add("Bob", 87);

            StringBuilder sb = new StringBuilder();
            foreach (var pair in scores)
            {
                sb.AppendLine($"{pair.Key}: {pair.Value}");
            }
            System.Console.WriteLine(sb.ToString());
        }
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Alice: 95
Bob: 87

7. استخدام الكائنات الثابتة (C# 6)

يستورد using static العناصر الثابتة لنوع ما، مما يتيح لك استدعاءها دون الحاجة إلى ذكر اسم النوع.

▶ مثال

CSHARP
using static System.Console;
using static System.Math;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            WriteLine($"PI = {PI}");
            WriteLine($"Max = {Max(10, 20)}");
            WriteLine($"Sqrt(144) = {Sqrt(144)}");
        }
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
PI = 3.14159265358979
Max = 20
Sqrt(144) = 12

8. الاستخدام العام (C# 10)

إن تعريف global using في ملف واحد يجعل مساحة الأسماء متاحة في جميع الملفات ضمن المشروع بأكمله، مما يلغي الحاجة إلى تكرار using.

▶ مثال

CSHARP
global using System;
global using System.Collections.Generic;
global using System.Linq;
▶ جرّب الكود

من الممارسات الشائعة وضع أوامر الاستخدام العامة في ملف GlobalUsings.cs من أجل الإدارة المركزية.


9. الاستخدامات الضمنية (C# 10)

يؤدي تمكين <ImplicitUsings>enable</ImplicitUsings> في ملف المشروع إلى قيام المشاريع التي تتبع نمط SDK بإضافة أوامر «using» عامة تلقائيًّا لمساحات الأسماء الشائعة الاستخدام.

▶ مثال

XML
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>

تتضمن مشاريع وحدة التحكم تلقائيًا مساحات الأسماء التالية: System، System.Collections.Generic، System.IO، System.Linq، System.Threading، System.Threading.Tasks، إلخ.


10. استخدام واجهة IDisposable

يضمن البيان using أن الكائنات IDisposable تقوم بتحرير الموارد بشكل صحيح بعد استخدامها. كما يدعم C# 8 صيغة إعلان using.

▶ مثال

CSHARP
using System;
using System.IO;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            using (var fs = new FileStream("test.txt", FileMode.Create))
            {
                byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello");
                fs.Write(data, 0, data.Length);
            }

            using var reader = new StreamReader("test.txt");
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello

يتم تحرير النموذج المحاط بأقواس متعرجة عند نهاية نطاقه؛ أما using var فيتم تحريره عند نهاية النطاق المحيط به.


11. تنظيم مساحات الأسماء في مكتبة فئات .NET

تنظم مكتبة فئات .NET الوظائف في مساحات أسماء فرعية تابعة لمساحة الاسم System.

▶ مثال

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

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            ArrayList list = new ArrayList { 1, 2, 3 };
            List````<string>```` names = new List````<string>```` { "Alice", "Bob" };
            var upper = names.Select(n => n.ToUpper());
            StringBuilder sb = new StringBuilder("Count: ");
            sb.Append(names.Count);
            Console.WriteLine(sb.ToString());
        }
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Count: 2
مساحة الاسم الغرض
System الأنواع الأساسية (Console، DateTime، Math، إلخ)
System.IO عمليات الملفات والدفق
System.Collections المجموعات غير العامة (ArrayList، Hashtable)
System.Collections.Generic المجموعات العامة (List<T>، Dictionary`<K,V>`)
System.Linq امتدادات استعلامات LINQ
System.Text معالجة السلاسل (StringBuilder، الترميز)
System.Threading العمليات المتوازية والتزامن
System.Threading.Tasks البرمجة غير المتزامنة (Task، Task<T>)

❓ أسئلة شائعة

س هل «مساحات الأسماء» و«التجميعات» (DLLs) مفهومان متطابقان؟
ج لا. فـ«مساحات الأسماء» هي تنظيم منطقي؛ أما «التجميعات» فهي نشر فعلي. ويمكن أن تحتوي تجميعة واحدة على عدة «مساحات أسماء»، كما يمكن أن تمتد «مساحة أسماء» واحدة عبر عدة تجميعات.
س هل تؤدي توجيهات using إلى زيادة حجم البرنامج؟
ج لا. إن using هي مجرد «تسهيلات نحوية» تُستخدم في مرحلة الترجمة لتبسيط الكتابة، ولا تؤثر على وقت التشغيل أو حجم البرنامج.
س هل يمكن تضمين مساحات أسماء فرعية داخل مساحة اسم ذات نطاق ملف؟
ج نعم، يمكنك تعريف مساحات أسماء فرعية باستخدام الأقواس المتعرجة داخل مساحة اسم ذات نطاق ملف.
س ما الفرق بين "global using" و"ImplicitUsings"؟
ج يتم إعلان "global using" يدويًّا من قِبل المطور؛ أما "ImplicitUsings" فهي مجموعة من أوامر "using" العالمية التي يتم إنشاؤها تلقائيًّا بواسطة SDK، والتي تعتمد على آلية "global using".
س هل يمكن استخدام الاستيراد الثابت (static import) لعناصر الكائن؟
ج لا، فاستخدام الاستيراد الثابت يقتصر على استيراد العناصر الثابتة والأنواع المتداخلة فقط. أما عناصر الكائن، فلا يزال يتعين استدعاؤها من خلال كائن.

📖 ملخص

📝 تمارين

  1. قم بإنشاء فئة Teacher في مساحة أسماء متداخلة من مستويين School.Teachers، وقم بإنشاء مثيل لها في Main
  2. استخدم الاسم المستعار using لإنشاء اسم مستعار مختصر لـ System.Collections.Generic.List``<string>، ثم استخدمه لإنشاء قائمة وإضافة عناصر إليها وعرضها
  3. استخدم using static System.Math لاستدعاء Sqrt وAbs وRound مباشرةً، وعرض النتائج
  4. قم بإنشاء ملف GlobalUsings.cs يحتوي على إعلانات global using لـ System وSystem.IO وSystem.Linq، ثم احذف هذه الاستخدامات في ملف آخر للتحقق من أنها تعمل
  5. استخدم كل من أسلوب العبارة بين الأقواس المتعرجة using وأسلوب الإعلان using var للكتابة في ملف باستخدام StreamWriter، ولاحظ الفرق
Web-Tutorial.com

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

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

100%