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
Добри практики
- Именуване
// Добре - следва структурата на компанията/проекта
namespace CompanyName.ProductName.ModuleName
namespace Microsoft.Office.Word
namespace Google.Cloud.Storage
// Лошо - твърде общи или неясни имена
namespace Utilities
namespace MyStuff
- Организация
// Добре - логическо групиране
namespace MyCompany.MyProduct.Core.Security
namespace MyCompany.MyProduct.Core.Logging
namespace MyCompany.MyProduct.Core.Configuration
// Лошо - смесване на концепции
namespace MyCompany.Security.Logging.Configuration
- Дълбочина
// Добре - 3-4 нива на вложеност
namespace Company.Product.Module.Feature
// Лошо - твърде много нива
namespace Company.Product.Module.SubModule.Feature.SubFeature.Implementation
- Съответствие с файлова система
// Файл: /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.