string s = "😊"; Console.WriteLine(s.Length); // 2, не 1Length считает не символы, а UTF-16 кодовые единицы. Эмодзи и многие Unicode-символы занимают две единицы — суррогатную пару. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
21 700подписчиков сейчас
Публикации всего: 68
👨💻 string в C# — не просто текст
string — это ссылочный тип с особой поддержкой рантайма. Внутри он хранит непрерывный блок UTF-16 кодовых единиц.
Отсюда первый сюрприз:
⚙️ nameof теперь понимает несвязанные обобщения
Удобство и гибкость метапрограммирования — теперь nameof работает для обобщений без аргументов.
Благодаря новой поддержке можно получить имена обобщенных типов без указания параметров:
Console.WriteLine(nameof(List<>)); // Выведет "List"📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
🗂 Работа и пет-проекты с одного ПК
Работаете днём в корпоративном репо, вечером в личном на GitHub. Один ПК, но email и ключи подписи разные. Ручная смена настроек Git каждый раз бесит и приводит к косякам с коммитами.
Условные includeIf решают всё
Добавьте в ~/.gitconfig пару строк. Git сам подхватит нужный конфиг по пути к папке или remote URL.
Для рабочих папок загрузит корпоративный email:
[includeIf "gitdir:~/work/"] path = .gitconfig-corpЛичные репозитории получат ваш домашний email автоматически:
[includeIf "hasconfig:remote.*.url:https://github.com/вашеимя/**"] path = .gitconfig-personalЗабудьте про git config --global user.email каждый раз. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view
👍 11 🤩 6 🌚 2 · всего 20
Перейти к публикации →
💥 Azure Functions: Linux Consumption уходит, на смену приходит Flex
Microsoft постепенно закрывает старый Linux Consumption Plan для Azure Functions. Его поддержка завершится 30 сентября 2028 года, а новые функции и версии языков для него уже не развиваются. Для новых serverless-приложений Microsoft рекомендует Flex Consumption.
🔘 Что меняется для .NET-разработчиков:
— Flex работает с .NET 8, 9 и 10 в isolated-модели;
— функции масштабируются независимо друг от друга;
— можно настраивать память инстанса;
— появилась интеграция с VNet;
— есть Always Ready-инстансы для снижения cold start;
— деплой идёт через blob storage, а не старый zip-deploy.
📍 Переключить существующий Linux Consumption App на Flex «на месте» нельзя. Нужно создать новое Function App в Flex, перенести конфигурацию и задеплоить код.
Для миграции Microsoft уже предлагает отдельный CLI:
az functionapp flex-migration startОн создаёт Flex-приложение на основе существующего Linux Consumption App. 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news
⚡️ C# 15 убирает флаг из вложенных циклов
Раньше для выхода сразу из нескольких foreach часто приходилось заводить переменную:
bool found = false;
foreach (var warehouse in warehouses)
{
foreach (var bin in warehouse.Bins)
{
if (bin.Sku == requestedSku)
{
found = true;
break;
}
}
if (found)
break;
}
🤩 В C# 15 можно обозначить внешний цикл и выйти из него напрямую:
scan: foreach (var warehouse in warehouses)
{
foreach (var bin in warehouse.Bins)
{
if (bin.Sku == requestedSku)
break scan;
}
}
Никаких found, дополнительного if и лишнего состояния.
C# 15 сейчас доступен в .NET 11 Preview 7.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view
🔥 28 ❤ 4 🥱 4 · всего 37
Перейти к публикации →
🗺 Группировка меток в картах MAUI
Если на карте десятки или сотни меток, они сливаются в непроходимую кашу. В .NET MAUI 11 Preview 3 появилась кластеризация меток из коробки на Android и iOS/Mac Catalyst.
🤩 Как включить
Одно свойство:
<maps:Map IsClusteringEnabled="True" />Ближайшие метки автоматически группируются в кластер с числом внутри. При увеличении масштаба кластер раскрывается до отдельных пинов. 🤩 Разные группы кластеров Если нужно, чтобы кофейни кластеризовались отдельно от парков, используем ClusteringIdentifier на Pin:
map.Pins.Add(new Pin
{
Label = "Pike Place Coffee",
Location = new Location(47.6097, -122.3331),
ClusteringIdentifier = "coffee"
});
map.Pins.Add(new Pin
{
Label = "Occidental Square",
Location = new Location(47.6064, -122.3325),
ClusteringIdentifier = "parks"
});
Пины с одинаковым идентификатором группируются вместе. С разными — образуют независимые кластеры, даже если географически рядом. Пины без идентификатора попадают в общую группу по умолчанию.
🤩 Обработка нажатия на кластер
При тапе на кластер срабатывает событие ClusterClicked:
map.ClusterClicked += async (sender, e) =>
{
string names = string.Join("\n", e.Pins.Select(p => p.Label));
await DisplayAlert(
$"Кластер ({e.Pins.Count} меток)",
names,
"OK");
// Отменить стандартное приближение к кластеру:
// e.Handled = true;
};
🤩 В ClusterClickedEventArgs три поля:
• Pins — список пинов в кластере
• Location — географический центр
• Handled — если true, стандартное поведение (зум к кластеру) отменяется.
🤩 Платформенные детали
На Android кластеризация работает через собственный алгоритм на основе сетки, пересчитывается при смене масштаба. Сторонние зависимости не нужны.
На iOS и Mac Catalyst используется нативный MKClusterAnnotation из MapKit — анимации и поведение платформенные.
Пример с кластеризацией уже есть в репозитории, страница Clustering в проекте MapDemo.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор😎 Три строки C# — и ваш AI-агент уже готов к хостингу в Azure
Microsoft показала интеграцию .NET с Foundry Hosted Agents: существующий агент на Microsoft Agent Framework можно превратить в hosted agent практически без изменения логики.
🤩 Достаточно добавить пакет:
dotnet add package Microsoft.Agents.AI.Foundry.Hosting --prerelease🤩 И три строки:
var builder = AgentHost.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.RegisterProtocol(
"responses",
endpoints => endpoints.MapFoundryResponses());
🤩 Дальше:
azd provision azd deployFoundry берёт на себя инфраструктуру, масштабирование, состояние сессий, identity, endpoint и observability. При этом сам AIAgent практически не меняется — вы просто добавляете вокруг него hosting-слой. 🔗 Источник: From dotnet run to Foundry Hosted Agent in 3 lines of C# 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news
🤩 6 🥱 2
Перейти к публикации →
🤩 EF Core: нормальный способ засевать базу
В EF Core 9 появились UseSeeding() и UseAsyncSeeding(), а в актуальном EF Core 10 это уже рекомендуемый Microsoft способ для обычного заполнения базы начальными данными.
optionsBuilder
.UseSeeding((context, _) =>
{
if (!context.Set<Role>().Any())
{
context.Set<Role>().AddRange(
new Role { Name = "Admin" },
new Role { Name = "User" });
context.SaveChanges();
}
});
Плюс в том, что seed выполняется вместе с Migrate и dotnet ef database update, а EF защищает его механизмом блокировки миграций.
🤩 А HasData теперь лучше использовать для статических и детерминированных данных — например, фиксированного справочника. Для данных, зависящих от состояния БД, внешних API или требующих вычислений, Microsoft рекомендует UseSeeding.
Если используете async-вариант, реализуйте и UseSeeding, и UseAsyncSeeding — EF tooling пока опирается на синхронный метод.
🔗 Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view
❤ 8 🔥 1
Перейти к публикации →
👨💻 Ложная иммутабельность
Часто новички в функциональном программировании думают, что сделали иммутабельный код. Берут список, вызывают ToList() или Select() и радуются новому списку. Но в C# это ловушка.
Проблема в ссылочных типах. var copy = original.ToList() создаёт новый List, но все элементы внутри — те же самые объекты. Меняете свойство через copy, и оригинал тоже меняется.
Правило трёх:
🤩 Records с init-only свойствами для value-like поведения
🤩 ImmutableList<T> из System.Collections.Immutable — настоящие неизменяемые коллекции
🤩 Struct только для маленьких типов
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view
История названий канала
14.08.2026
название
Библиотека шарписта
→
Библиотека шарписта | C#, F#, .NET, ASP.NET
Дата — момент, когда изменение заметил наш обход.