В 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 файле), тогда как `<# ... #>` используется для генерации конкретного выходного текста и исполняется при каждой трансформации шаблона.