Классический ILogger.LogInformation($"User {userId}")
выглядит безобидно, но на деле компилятор: формирует итоговую строку через string.Format
‑like логику, боксит userId
, DateTime
, struct‑ы и прочее добро, а так же линкует все в object[]
ради структурированных логов.
Аллокационная цена вопроса — порядка 80 Б на сообщение (плюс трансферы в LOH, если вы особо многословны).
В.NET 8 Microsoft даже вынесла отдельный раздел «high‑performance logging» и честно сказала: «Да, обычные extension‑методы логов боксят и аллоцируют»
С выходом C# 10 компилятор научился разбирать $"строка"
не напрямую в string
, а в handler: структуру, которая получает куски литералов и плейсхолдеры. Базовый — DefaultInterpolatedStringHandler
.