.NET epeshk blog
Open in Telegram
Канал с заметками о C# и .NET Поддержать канал: https://t.me/blog_donate/2 Обратная связь: https://forms.gle/3uRz7FmzUA26Kw4y5
Show more2 689
Subscribers
No data24 hours
-27 days
-1730 days
Posts Archive
2 689
goodbye, gc.cpp!
Ушла эпоха. В .NET 11 Garbage Collector разделили по файлам. Больше нет легендарного gc.cpp с более 50к строк кода
https://github.com/dotnet/runtime/pull/125703
2 689
C# показал рекордный рост популярности (+2.39%) в индексе TIOBE
а Go за год опустился с 7 позиции до 16
Реальность:
- C# в индексе восстановился до уровня 2024 года в 7.4 после просадки до 4.2 в прошлом году
- индекс TIOBE основан на статистике поисковых запросов, и показывает что шарписты до сих пор пользуются гуглом, а гошники сразу спрашивают чат гпт
Методология TIOBE абсурдная изначально, т.к. показывает социальный интерес к языкам, а не то, на чём реально программируют после появления LLM полностью некорректна.
Другие рейтинги языков программирования тоже необъективны, но всё же лучше, они в отличие от TIOBE хотя бы видят TypeScript
Рейтинг от GitHub, с bias в опенсорсный код
Рейтинг от Jetbrains, с bias к пользователям Jetbrains IDE
Рейтинг от StackOverflow, с bias к пользователям StackOverflow (который тоже заменяют LLM)
@epeshkblog
2 689
Есть попытки запуска веб-приложений на shared-webview2 который уже входит в ОС, например tauri. Но shared-библиотеки уже пробовали, и в 2010-х от них начали массово отказываться, даже дотнет приложения теперь таскают за собой весь рантайм. Скорее всего, после первой же проблемы с tauri для экономии времени на разработку будут снова таскать с собой весь браузер, это выгодно всем, в том числе производителям дисков и RAM
@epeshkblog
2 689
Снова про Windows 11
Вчера наконец-то поставил Windows 10 вместо Windows 11.
Недавно вышел пост про планы Microsoft переписать Windows на Rust с помощью AI-агентов в концепции 1 человек, 1 месяц, 1 миллион строк кода. Microsoft выпустили опровержение: переписывания на Rust не будет. Windows перепишут на TypeScript.
Медленная прорисовка webview2-элементов и стала последней каплей. Когда нажимаешь на иконку вайфай, появляется пустое всплывающее окно и только через секунду отрисовываются элементы внутри. Так происходит из-за того, что каждое подобное окно — по сути отдельная вкладка браузера.
Ещё по неизвестной причине перестал работать WSL, т.е. система уже требовала переустановки.
Откатить оказалось проще, чем казалось:
- лицензия при откате сохраняется
- файлы 11 винды бэкапятся в Windows.old. Форматирование диска не обязательно
- большинство программ подхватывают подложенные в
AppData\Local, AppData\Roaming настройки
- внезапно, Edge в Windows 10 хоть и основан на Chromium, но работает с дичайшими лагами. Не более 10фпс. В других браузерах проблем нет. Майки смогли сделать то, с чем не справились сотни браузероклепателей-любителей
Почему откатил, а не остался на StartAllBack, OpenShell, ExplorerPatcher:
- Баги. В сторонних утилитах UI-элементы Windows 10 воссозданы с нуля, не всегда работают, отличаются по дизайну и поведению от оригинала. выглядит глупо, когда меню громкости из семёрки, wi-fi из десятки, а батареи — из 11
- Сторонние шеллы исправляют только визуальную часть. webview2 компоненты остаются в системе и продолжают потреблять память зря
- AI-агенты майкрософт продолжают ломать windows 11 в обновлениях, например мгновенно открывающееся Win+R окно заменили на webview2-компонент
====
https://www.youtube.com/watch?v=7VZJO-hOT4c
https://habr.com/ru/news/982546/
На ютубе появился реалистичный тест различных версий винды в одинаковых условиях
Время загрузки:
- Windows XP и 10 загружаются за одинаковое время
- Windows 11 на 20-40 секунд медленнее. Из-за того, что интерфейс системы AI-сгенерирован, при тесте выстрелил баг с долгой прорисовкой таскбара, что и добавило 20 секунд
В Windows 8.1 явно провели работу над оптимизацией потребления места на диске и в RAM. 11-ая версия прибавила гигабайт в RAM относительно 10
Количество вкладок в Chromium браузере:
- Windows 11 оказалась хуже Windows XP, не справившись с открытием 50 вкладок. Полностью соотносится с тем, что я наблюдал на 11 винде вживую
- Windows 8.1 выдерживает 250 вкладок, а 10 — 150. Что все равно гораздо лучше 11
Тесты по скорости загрузки программ — Windows 11 снова оказалась медленнее всех
====
Имхо, использование Windows 11 это расчеловечивающая пытка, и надо откатываться на 10, и ждать 12 или переходить на мак.
Скорее всего webslop это будущее всех ОС. Живых людей с компетенциями в разработке нативного UI почти не осталось, рыночек порешал, и подобную работу найти невозможно в отличие от веба, да и платят на ней меньше. Хоть навык и уникальный, сотрудника можно пугать сложностями поиска работы, и дешевизной переписывания на web.
LLM отлично справляются с React, Typescript, и Python, что эти языки вытесняют остальные. Когда только вышел ChatGPT я ожидал, что статическая типизация будет помогать валидировать результаты AI-генерации. Так вот, ни-хре-на. Для типизированного кода нужна умная LLM, которая может удерживать в контексте одновременно бизнес-логику и типы, а не подписка за $20 в месяц
Web проник даже в консольные утилиты. Claude Code написан с использованием ink — либы, позволяющей рендерить реакт компоненты прямо в терминале. В итоге бинарник тонкого клиента, отправляющего запросы в LLM на сервер весит 208 МБ!!!2 689
IAsyncEnumerator<T> и его использование вручную
Енумераторы в дотнете можно использовать двумя способами: через foreach, и вручную, через MoveNext/Dispose. Второй способ часто приводит к багам.
В этом методе разработчик пытался реализовать обёртку для
IAsyncEnumerable<T>, которая распараллеливает обработку текущего элемента последовательности и получение следующего:
public static async IAsyncEnumerable<T> Prefetch<T>(
this IAsyncEnumerable<T> source) {
await using var enumerator = source.GetAsyncEnumerator();
var nextTask = enumerator.MoveNextAsync();
while (true) {
if (!await nextTask)
yield break;
var current = enumerator.Current;
nextTask = enumerator.MoveNextAsync(); // запускаем MoveNext перед возвратом управления в вызывающий код
yield return current;
}
}
// USAGE //
var sw = Stopwatch.StartNew();
await foreach (var x in En())
await Task.Delay(100);
Console.WriteLine("Without prefetch: " + sw.ElapsedMilliseconds); // 700
sw.Restart();
await foreach (var x in En().Prefetch())
await Task.Delay(100);
Console.WriteLine("With prefetch: " + sw.ElapsedMilliseconds); // 400
async IAsyncEnumerable<int> En()
{
await Task.Delay(100);
yield return 1;
await Task.Delay(100);
yield return 2;
await Task.Delay(100);
yield return 3;
await Task.Delay(100);
}
Однако, такой код сломается, если внутри await foreach сделать break:
await foreach (var x in En().Prefetch())
break;
Unhandled exception. System.NotSupportedException: Specified method is not supported.
at Program.<<Main>$>g__En|0_0()+System.IAsyncDisposable.DisposeAsync()
at Extensions.Prefetch[T](IAsyncEnumerable`1 source)+MoveNext()
Ошибка возникает потому что у `IAsyncEnumerator<T>` нельзя одновременно вызывать `MoveNextAsync` и `DisposeAsync`. А в реализации Prefetch так и происходит — после break сразу вызывается DisposeAsync (из-за await using) для переменной enumerator, при наличии незавершенного nextTask
В зависимости от реализации IAsyncEnumerator<T> возможны и другие симптомы неправильного взаимодействия MoveNext и Dispose, например утечки памяти
Исправить можно явно дожидаясь nextTask перед enumerator.DisposeAsync():
public static async IAsyncEnumerable<T> Prefetch<T>(this IAsyncEnumerable<T> source)
{
await using var enumerator = source.GetAsyncEnumerator();
var nextTask = enumerator.MoveNextAsync();
try {
while (true) {
var nextTaskResult = await nextTask;
nextTask = default;
if (!nextTaskResult)
yield break;
var current = enumerator.Current;
nextTask = enumerator.MoveNextAsync();
yield return current;
}
}
finally {
if (nextTask != default)
await nextTask;
}
}
Такое исправление решает эту проблему — теперь MoveNextAsync и DisposeAsync вызываются последовательно, и ошибки не возникает.
@epeshkblog
@epeshkblog2 689
🙈 Goodbye, Windows 11!
Наконец-то я смог открыть ноут и установить в него второй SSD. Мучения с Windows 11 скоро закончатся.
Пользоваться Windows 11 стало невозможно. Постоянные утечки памяти, фризы, чёрные экраны. Куча бесполезных жрущих память процессов: Antimalware (MsMpEng), StartMenuExperienceHost, PhoneExperienceHost (я вообще не подключаю телефон к ноуту, какой phone experience, a), msedgewebview2 (они переписали интерфейс системы на TypeScript)
Помогите выбрать, что установить. Windows 10 LTSC, Ubuntu, Mint, CachyOS? Или какой-то другой дистрибутив? Как вариант наверное поставить линукс на второй SSD, перенести данные на него, дальше на первый диск переустановить на 10-ую винду
2 689
Перегрузка операторов
С новыми extension-методами наконец-то появилась перегрузка операторов для сторонних типов:
static class Extensions {
extension<T>(IEnumerable<T>) {
public static IEnumerable<T> operator +(IEnumerable<T> a, IEnumerable<T> b)
=> a.Concat(b);
}
extension<T>(T[]) {
public static T[] operator +(T[] a, T[] b)
=> a.Concat(b).ToArray();
}
}
Выглядит синтаксис с extensions<T>(TypeName<T>) максимально странно, зато extension-ы наконец-то избавились от странных ограничений старого синтаксиса с this
@epeshkblog2 689
Перегрузка операторов
С новыми extension-методами наконец-то появилась перегрузка операторов для сторонних типов:
```csharp
2 689
2025 год: $10 млрд — AI Bubble, капитализация всего финансового рынка
2050 год: на $10 млрд нельзя купить бамбл в московской кофейне
2 689
Вступите в чат с комментариями
Сейчас на чат канала происходят постоянные набеги ботов. Телеграм позволяет включить антиспам только в чатах с более 200 участниками. Сейчас увы только 150
2 689
Враждебный к юзеру софт
Чтобы софт стал успешным, он должен ненавидеть пользователя. Считать его дурачком и регулярно ему об этом напоминать.
И вот два примера, хотя подобные дизайн-паттерны стали повсеместными
App Store — юзеру разрешено ставить только одобренные версии софта, и только последние версии. Значит можно выпустить хороший продукт, а затем нафаршировать его рекламой. Иногда приложения удаляют просто так, чтобы напомнить юзеру его место в этой жизни. Или можно объявить, а теперь поддерживается только iOS 27, все вперёд за айфоном 18 про мах
Скриншоты — да, в 2025 году смогли убить скриншоты. Если раньше на скриншоте было тоже самое, что на экране у пользователя, то сейчас там обязательно будет что-нибудь другое. Приложения понимают, когда юзер нажимает кнопку скриншота и рисуют поверх вотермарку 𝕏.com
Или скриншотишь пост на реддите, и сразу вылетает уведомление А ССЫЛКОЙ ТО УДОБНЕЕ. Хотя скриншот имеет смысл чтобы сохранить пост до его удаления модераторами этой социальной сети.
Скриншотишь код выдачи заказа — вылетает уведомление А ДЕЛИТЬСЯ КОДОМ СТАЛО УДОБНЕЕ ПО ССЫЛКЕ. Но причина делать скришнот в этом случае — доступность без интернета, если показывать код надо в подвале
Что отберут у нас разработчики iOS и Android в следующем году?
@epeshkblog
