В T4 шаблонах существуют различные виды блоков, которые можно использовать для разных целей:
1. **Текстовый блок (Text Block)**: Просто текст, который будет скопирован в выходной файл без изменений.
2. **Контрольный блок (Control Block)**: Содержит исполняемый код и заключается в угловых скобках с символами `<#` и `#>`. Пример:
```t4
<# int x = 10; #>
```
3. **Выражение (Expression Block)**: Возвращает значение и заключается в угловых скобках с символами `<#=` и `#>`. Пример:
```t4
<#= DateTime.Now #>
```
4. **Блок класса (Class Feature Block)**: Позволяет определять методы, свойства, поля и другие члены класса. Заключается в угловых скобках с символами `<#+` и `#>`.
> Обратите внимание! В T4 шаблонах текст не может находиться вне блоков после последнего Class Feature Block, иначе будет ошибка "Text cannot be placed after last feature block". Поэтому проще всего данный блок размещать в конце T4-файла.
Пример:
```t4
<#+
private string GetHello() => "Hello, world!";
#>
```
5. **Директива (Directive Block)**: Управляет поведением шаблона, таким как импорт пространства имён или ссылка на сборку. Пример:
```t4
<#@ import namespace="System.Linq" #>
```
Эти блоки вместе обеспечивают гибкость и мощь в создании шаблонов для генерации кода. Вы можете комбинировать их так, как подходит для ваших задач, при этом не влияя на производительность генерации кода.
### В чем разница между синтаксисами:`<#+ ... #>` и `<# ... #>`?
В T4 шаблонах (Text Template Transformation Toolkit) используются различные блоки синтаксиса для разных целей. Разница между `<#+ ... #>` и `<# ... #>` заключается в том, как и где эти блоки используются:
1. **<#+ ... #> - Классовый блок (Class Feature Control Block)**
- Эти блоки используются для определения кода, который добавляется к сгенерированному классу шаблона и сохраняется между различными блоками и вызовами шаблона.
- Код внутри `<#+ ... #>` может включать определения функций, свойств, классов и другие конструкции, которые становятся частью класса шаблона.
- Обычно этот тип блока используется в файле `ttinclude` для описания кода, который может быть переиспользован в разных шаблонах. Это полезно для создания вспомогательных методов и классов, которые не должны генерироваться каждый раз, когда выполняется шаблон.
Пример:
```t4
<#+
public void HelperMethod()
{
// Метод, доступный в шаблоне
}
#>
```
2. **<# ... #> - Контрольный блок (Control Block)**
- Эти блоки используются для вставки кода, который непосредственно выполняется при трансформации шаблона.
- Код в `<# ... #>` исполняется в процессе генерации текста, и обычно в них размещают логику, которая манипулирует выходными данными, такую как циклы, условные операторы, или напрямую выводит текст в результат генерации.
Пример:
```t4
<#
for (int i = 0; i < 5; i++)
{
Write("Number " + i.ToString());
}
#>
```
**Основное различие** заключается в том, что `<#+ ... #>` определяет элементы, которые становятся частью класса шаблона и могут быть использованы в разных местах шаблона или даже в разных шаблонах (если код находится в include файле), тогда как `<# ... #>` используется для генерации конкретного выходного текста и исполняется при каждой трансформации шаблона.