Прескочи до съдържанието
Редактирай

Namespaces

Namespaces

Namespaces в C# са инструмент, който ни позволява да групираме и организираме кода. Те помагат за избягване на конфликти между имената и създават логическа структура на проекта.

Основен синтаксис

// Деклариране на namespace
namespace MyCompany.MyProduct.Core
{
    public class MyClass
    {
        // Код на класа
    }
}

// File-scoped namespace (C# 10+)
namespace MyCompany.MyProduct.Core;

public class MyClass
{
    // Код на класа
}

Using директиви

// Стандартни using директиви
using System;
using System.Collections.Generic;
using System.Linq;

// Статичен using
using static System.Math;
using static System.Console;

// Alias using
using Project = MyCompany.MyProduct.Core;
using Dict = System.Collections.Generic.Dictionary<string, int>;

// Global using (C# 10+)
global using System;
global using System.Collections.Generic;

namespace MyCompany.MyProduct
{
    public class Program
    {
        public void Example()
        {
            // Използване на статичен using
            var result = Pow(2, 3); // вместо Math.Pow
            WriteLine(result);      // вместо Console.WriteLine

            // Използване на alias
            var dict = new Dict();
            var obj = new Project.MyClass();
        }
    }
}

Вложени namespaces

namespace MyCompany
{
    namespace MyProduct
    {
        namespace Core
        {
            public class MyClass { }
        }
    }
}

// Еквивалентно на:
namespace MyCompany.MyProduct.Core
{
    public class MyClass { }
}

Организация на код

// Инфраструктурен слой
namespace MyCompany.MyProduct.Infrastructure
{
    public interface IRepository<T> { }
    public class SqlRepository<T> : IRepository<T> { }
}

// Бизнес слой
namespace MyCompany.MyProduct.Business
{
    public interface IOrderService { }
    public class OrderService : IOrderService { }
}

// Презентационен слой
namespace MyCompany.MyProduct.Presentation
{
    public class OrderViewModel { }
    public class OrderView { }
}

Разрешаване на конфликти

namespace MyCompany.Logging
{
    public class Logger { }
}

namespace MyCompany.App
{
    using MyLogger = MyCompany.Logging.Logger;
    using ExtLogger = ExternalCompany.Logging.Logger;

    public class Program
    {
        private MyLogger logger1 = new MyLogger();
        private ExtLogger logger2 = new ExtLogger();

        // Или с пълно име
        private MyCompany.Logging.Logger logger3 = new MyCompany.Logging.Logger();
    }
}

Структура на проект

MyCompany.MyProduct/
├── Core/
│   ├── Models/
│   │   └── Customer.cs          // namespace MyCompany.MyProduct.Core.Models
│   └── Interfaces/
│       └── IRepository.cs       // namespace MyCompany.MyProduct.Core.Interfaces
├── Infrastructure/
│   ├── Data/
│   │   └── DbContext.cs         // namespace MyCompany.MyProduct.Infrastructure.Data
│   └── Services/
│       └── EmailService.cs      // namespace MyCompany.MyProduct.Infrastructure.Services
└── Presentation/
    ├── ViewModels/
    │   └── MainViewModel.cs     // namespace MyCompany.MyProduct.Presentation.ViewModels
    └── Views/
        └── MainWindow.xaml.cs   // namespace MyCompany.MyProduct.Presentation.Views

Добри практики

  1. Именуване
// Добре - следва структурата на компанията/проекта
namespace CompanyName.ProductName.ModuleName
namespace Microsoft.Office.Word
namespace Google.Cloud.Storage

// Лошо - твърде общи или неясни имена
namespace Utilities
namespace MyStuff
  1. Организация
// Добре - логическо групиране
namespace MyCompany.MyProduct.Core.Security
namespace MyCompany.MyProduct.Core.Logging
namespace MyCompany.MyProduct.Core.Configuration

// Лошо - смесване на концепции
namespace MyCompany.Security.Logging.Configuration
  1. Дълбочина
// Добре - 3-4 нива на вложеност
namespace Company.Product.Module.Feature

// Лошо - твърде много нива
namespace Company.Product.Module.SubModule.Feature.SubFeature.Implementation
  1. Съответствие с файлова система
// Файл: /src/Core/Models/Customer.cs
namespace MyCompany.MyProduct.Core.Models
{
    public class Customer { }
}

Често използвани системни namespaces

// Основни типове
using System;                     // DateTime, Exception, etc.
using System.Collections.Generic; // List<T>, Dictionary<K,V>, etc.
using System.Linq;               // LINQ методи
using System.Text;               // StringBuilder
using System.Threading.Tasks;    // Task, async/await

// IO операции
using System.IO;                 // File, Directory
using System.Net.Http;          // HttpClient
using System.Xml;               // XML обработка

// UI (WPF)
using System.Windows;            // Window, Application
using System.Windows.Controls;   // Button, TextBox
using System.Windows.Media;      // Brushes, Colors

Модулна организация

// Основен модул
namespace MyCompany.MyProduct
{
    public interface IModule
    {
        void Initialize();
    }
}

// Модул за сигурност
namespace MyCompany.MyProduct.Security
{
    public class SecurityModule : IModule
    {
        public void Initialize() { }
    }
}

// Модул за логване
namespace MyCompany.MyProduct.Logging
{
    public class LoggingModule : IModule
    {
        public void Initialize() { }
    }
}

За да използваме класове от друг Namespace, трябва да използваме ключовата дума using.