В C# типы можно разделить на две основные категории: **обобщённые** и **необобщённые** (или конкретные). Давайте разберёмся, какие ещё могут быть типы, если тип не является обобщённым.
### 1. **Необобщённые (конкретные) типы**
Это типы, которые **не зависят от параметров типа** и всегда работают с конкретными типами данных. Такие типы определяют строгие правила, какие данные они могут хранить или обрабатывать.
#### Примеры необобщённых типов:
- **Простые типы** (или примитивные типы):
- `int`
- `bool`
- `char`
- `float`
- `double`
- **Структуры**:
- `DateTime`
- `Guid`
- `TimeSpan`
- **Классы**:
- `String`
- `Object`
- `Stream`
- **Коллекции, не использующие обобщения**:
- `ArrayList`
- `Hashtable`
- **Пользовательские типы**:
- Любые классы и структуры, которые вы создаёте в своём коде, например:
```csharp
public class MyClass
{
public int MyField;
}
```
### 2. **Обобщённые типы**
Как уже было упомянуто, обобщённые типы позволяют работать с различными типами данных через параметры типа. Эти типы содержат параметры, которые заменяются конкретными типами на этапе компиляции.
#### Примеры обобщённых типов:
- `List<T>`
- `Dictionary<TKey, TValue>`
- `Nullable<T>`
- `Task<T>`
Обобщённые типы могут принимать один или несколько параметров типа, и эти параметры могут быть любого типа данных.
### 3. **Обобщённые vs. Необобщённые**
| Категория | Пример | Описание |
|-----------|--------|----------|
| **Необобщённый тип** | `int` | Это конкретный тип, который работает только с целыми числами. |
| **Необобщённый класс** | `ArrayList` | Это коллекция, которая может хранить объекты любого типа, но без явной проверки типов. |
| **Обобщённый тип** | `List<T>` | Это коллекция, которая может быть типизирована любым конкретным типом, например `List<int>`. |
| **Необобщённый пользовательский тип** | `MyClass` | Это класс, который хранит данные строго определённого типа. |
| **Обобщённый пользовательский тип** | `MyGenericClass<T>` | Это класс, который может принимать любой тип как параметр. |
### 4. **Другие типы в C#**
Кроме разделения на обобщённые и необобщённые, существуют и другие категории типов в C#:
- **Массивы**:
- Массивы, например `int[]`, являются коллекциями фиксированной длины. Они не обобщённые, но типизированные.
- **Перечисления (enums)**:
- `enum DayOfWeek { Sunday, Monday, ... }` — перечисление фиксированных значений.
- **Интерфейсы**:
- `IEnumerable`, `IDisposable` — интерфейсы, которые определяют контракт для классов и структур.
- **Делегаты**:
- `Action`, `Func<int, string>` — типы, представляющие методы и их сигнатуры.
### Заключение:
Необобщённые (конкретные) типы — это типы, которые работают с заранее определёнными типами данных (например, `int`, `string`, классы без параметров типа). Обобщённые типы, такие как `List<T>`, позволяют создавать универсальные структуры данных и методы, которые могут работать с разными типами, что делает код более гибким и переиспользуемым.