Search
Write a publication
Pull to refresh

Comments 4

Это просто шикарно!

С выходом C# 10 компилятор научился разбирать $"строка" не напрямую в string, а в handler: структуру, которая получает куски литералов и плейсхолдеры. Базовый – DefaultInterpolatedStringHandler.

У меня тоже была проблема с аллокациями в логах, и решал я её как-то так:

string text = $”Значение равно {value}%”;
mew text = (“Значение равно “, value , “%”);
//mew - значимый тип, который хранит фрагменты строки
//в их исходном виде (строки как строки,
//числа — как числа, bool как bool).
//Первые 48 фрагментов хранятся на стеке,
//далее уже идёт аллокация в куче.

Но синтаксис кортежей это просто боль после $"значение:{value}". Теперь же, как я понял, можно к этой штуке прикрутить нормальный синтаксис конкатенации строк.

Вообще странно, что они не сделали сам тип string как-нибудь так, чтобы если строка короткая, то она пыталась бы храниться на стеке. Смысла дёргать кучу из-за текста в 10 букв, имхо, нет.

Вообще странно, что они не сделали сам тип string как-нибудь так, чтобы если строка короткая, то она пыталась бы храниться на стеке.

  1. Есть подвижки в .NET 10.0 в эту сторону, но чтобы объект можно было аллоцировать на стеке, джит должен сам себе доказать что он никаким образом не убегает в хип

  2. Эфемерные аллокации типа таких не нагружают гц, люди часто с ними борятся непонятно зачем. Гораздо хуже аллокации при которых создаются Gen2 -> Gen0 линки

Спасибо за статью! Странно что подобного хендлера нет из коробки...

Sign up to leave a comment.