
🌸 Майская распродажа
Скидки до 70% в каталоге + дополнительно 3,5% по промокоду HAPPYMAY
В каталог
Купить рекламу в этом канале
Формат:
keyboard_arrow_down
- 1/24
- 2/48
- 3/72
- Нативный
- 7 дней
- Репост
1 час в топе / 24 часа в ленте
Количество:
keyboard_arrow_down
- 1
- 2
- 3
- 4
- 5
- 8
- 10
- 15
Стоимость публикации:
local_activity
12 167.82₽12 167.82₽local_mall
0.0%
Осталось по этой цене:0
Последние посты канала
imageИзображение не доступно для предпросмотра
📚 Модернизация .NET веб-приложений с помощью DotVVM и новой книги Томаша Герцега
В свежем выпуске подкаста [The .NET Core Show](https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/) Томаш Герцег — Microsoft MVP и автор фреймворка DotVVM — рассказывает, как безболезненно обновлять устаревшие .NET-приложения.
🔧 Что такое DotVVM
DotVVM — это open-source MVVM-фреймворк, предназначенный для поэтапной миграции с ASP.NET Web Forms на современный .NET:
- Позволяет переписывать старые приложения постепенно, без необходимости полного рефакторинга
- Поддерживает .NET Framework и .NET Core
- Совместим с существующей кодовой базой, не нарушая архитектуру
DotVVM выступает как мост между устаревшими технологиями и современным стеком, позволяя сохранять бизнес-логику и UI.
🎧 Слушать эпизод подкаста:
https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/
#DotVVM #DotNet #WebForms #ASPNet #Modernization #TomasHerceg #SoftwareDevelopment #LegacyToModern
В свежем выпуске подкаста [The .NET Core Show](https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/) Томаш Герцег — Microsoft MVP и автор фреймворка DotVVM — рассказывает, как безболезненно обновлять устаревшие .NET-приложения.
🔧 Что такое DotVVM
DotVVM — это open-source MVVM-фреймворк, предназначенный для поэтапной миграции с ASP.NET Web Forms на современный .NET:
- Позволяет переписывать старые приложения постепенно, без необходимости полного рефакторинга
- Поддерживает .NET Framework и .NET Core
- Совместим с существующей кодовой базой, не нарушая архитектуру
DotVVM выступает как мост между устаревшими технологиями и современным стеком, позволяя сохранять бизнес-логику и UI.
🎧 Слушать эпизод подкаста:
https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/
#DotVVM #DotNet #WebForms #ASPNet #Modernization #TomasHerceg #SoftwareDevelopment #LegacyToModern
1900
17:31
16.05.2025
imageИзображение не доступно для предпросмотра
Вечером 29 мая состоится трансляция питерского .NET-митапа от SpbDotNet и Altenar
Зрители онлайна смогут задавать вопросы спикерам. Регистрируйтесь, чтобы не потерять ссылки на трансляции и получить доступ к записям.
• В 19:00 (мск) Владимир Куропатка расскажет, как добиться высокой производительности и отказоустойчивости при использовании Serilog в проектах.
• В 20:30 Константин Финагин покажет, как писать простые и наглядные юнит-тесты — без тонущих в ассертах простыней кода.
Подробности о докладах и митапе — на странице регистрации. Увидимся в эфире!
Зрители онлайна смогут задавать вопросы спикерам. Регистрируйтесь, чтобы не потерять ссылки на трансляции и получить доступ к записям.
• В 19:00 (мск) Владимир Куропатка расскажет, как добиться высокой производительности и отказоустойчивости при использовании Serilog в проектах.
• В 20:30 Константин Финагин покажет, как писать простые и наглядные юнит-тесты — без тонущих в ассертах простыней кода.
Подробности о докладах и митапе — на странице регистрации. Увидимся в эфире!
2100
15:33
16.05.2025
🧠 C# Задача: структура, интерфейс и потеря состояния
Эта задача проверяет знание нюансов работы
📦 Задача
❓ Что выведет код?
A) 0
😎 1
C) 2
D) Ошибка компиляции
💡 Разбор
Наивный ответ — 2, ведь Increment() вызывается дважды. Но!
📦 Counter — это struct, то есть value type.
Когда мы присваиваем Counter переменной типа ICounter, происходит boxing — создаётся копия структуры в heap.
🔁 Каждый вызов counter.Increment() работает с новой копией, потому что интерфейс не может напрямую изменить struct без создания временного объекта.
🧱 В итоге Increment() изменяет внутреннее состояние временной копии, но не оригинального значения.
✅ Ответ: 0
🧨 Подвох
Использование struct через интерфейс приводит к boxing.
Вызываемые методы действуют на копии, а не на оригинале.
Изменения теряются, и это не ошибка компиляции — это логическая ловушка.
🔧 Как исправить?
Вариант 1: Сделать Counter классом:
```csharp
public class Counter : ICounter
{
private int _value;
public void Increment() => _value++;
public int Value => _value;
}
public class Counter : ICounter
{
private int _value;
public void Increment() => _value++;
public int Value => _value;
}```
@csharp_ci
Эта задача проверяет знание нюансов работы
struct
с интерфейсами. Поведение кажется очевидным — но только на первый взгляд.📦 Задача
using System;
public interface ICounter
{
void Increment();
int Value { get; }
}
public struct Counter : ICounter
{
private int _value;
public void Increment()
{
_value++;
}
public int Value => _value;
}
class Program
{
static void Main()
{
ICounter counter = new Counter();
counter.Increment();
counter.Increment();
Console.WriteLine(counter.Value);
}
}
❓ Что выведет код?
A) 0
😎 1
C) 2
D) Ошибка компиляции
💡 Разбор
📦 Counter — это struct, то есть value type.
Когда мы присваиваем Counter переменной типа ICounter, происходит boxing — создаётся копия структуры в heap.
🔁 Каждый вызов counter.Increment() работает с новой копией, потому что интерфейс не может напрямую изменить struct без создания временного объекта.
🧱 В итоге Increment() изменяет внутреннее состояние временной копии, но не оригинального значения.
✅ Ответ: 0
🧨 Подвох
Использование struct через интерфейс приводит к boxing.
Вызываемые методы действуют на копии, а не на оригинале.
Изменения теряются, и это не ошибка компиляции — это логическая ловушка.
🔧 Как исправить?
Вариант 1: Сделать Counter классом:
```csharp
public class Counter : ICounter
{
private int _value;
public void Increment() => _value++;
public int Value => _value;
}
public class Counter : ICounter
{
private int _value;
public void Increment() => _value++;
public int Value => _value;
}```
@csharp_ci
2200
10:11
16.05.2025
imageИзображение не доступно для предпросмотра
✍️ RoslynPad — легковесная C#-песочница с интеллектуальным кодом. Этот кроссплатформенный редактор превращает написание C#-кода в интерактивный процесс. В отличие от громоздких IDE, здесь есть только самое нужное: автодополнение на базе Roslyn, подсветка ошибок и быстрый запуск кода.
Проект особенно удобен для экспериментов: можно тестировать фрагменты кода без создания полноценного проекта. Под капотом у инструмента движок компилятора C# и редактор AvalonEdit с поддержкой темной темы.
🤖 GitHub
@csharp_ci
Проект особенно удобен для экспериментов: можно тестировать фрагменты кода без создания полноценного проекта. Под капотом у инструмента движок компилятора C# и редактор AvalonEdit с поддержкой темной темы.
🤖 GitHub
@csharp_ci
2700
10:03
15.05.2025
imageИзображение не доступно для предпросмотра
💡 20 мая в 20:00 пройдет бесплатный вебинар "Реализация инвентаря в Unity" с экспертом, выпустившим 360+ студентов в GameDev. Запись: https://otus.pw/DKth/
💯 Инвентарь — одна из ключевых механик в RPG, survival-играх и даже мобильных проектах. Но 90% разработчиков делают её без возможности масштабирования. Мы это исправим!
Основные темы урока:
📍 Создание на основе реального технического задания.
📍Реализация предмета от простого к сложного.
📍 Реализация инвентаря.
📍 Эффекты предметов.
📈 Вебинар будет полезен:
- Unity-разработчикам уровня Junior/Junior+.
- Middle Unity-разработчикам.
- Программистам на C#, желающим перейти в GameDev.
- Инди-разработчикам.
🎁 Переходите на сайт, чтобы зарегистрироваться на вебинар 20 мая и получить запись предыдущего вебинара: https://otus.pw/DKth/
erid: 2W5zFGDdjV2
💯 Инвентарь — одна из ключевых механик в RPG, survival-играх и даже мобильных проектах. Но 90% разработчиков делают её без возможности масштабирования. Мы это исправим!
Основные темы урока:
📍 Создание на основе реального технического задания.
📍Реализация предмета от простого к сложного.
📍 Реализация инвентаря.
📍 Эффекты предметов.
📈 Вебинар будет полезен:
- Unity-разработчикам уровня Junior/Junior+.
- Middle Unity-разработчикам.
- Программистам на C#, желающим перейти в GameDev.
- Инди-разработчикам.
🎁 Переходите на сайт, чтобы зарегистрироваться на вебинар 20 мая и получить запись предыдущего вебинара: https://otus.pw/DKth/
erid: 2W5zFGDdjV2
2600
09:05
15.05.2025
play_circleВидео недоступно для предпросмотра
Режим агента в Visual Studio позволяет задавать задачи с помощью естественного языка — Copilot самостоятельно планирует действия, редактирует кодовую базу, вызывает инструменты и итеративно решает проблемы.
В отличие от Copilot Chat или Copilot Edits, агент не останавливается на одной подсказке или правке файла — он действует автономно и выполняет задачу до конца.
https://devblogs.microsoft.com/visualstudio/agent-mode-has-arrived-in-preview-for-visual-studio/
@csharp_ci
3100
09:09
14.05.2025
imageИзображение не доступно для предпросмотра
🚀 NBomber — нагрузочное тестирование на .NET без привязки к протоколам. Этот фреймворк позволяет описывать сценарии нагрузочного тестирования на чистом C#/F#, без изучения специализированного DSL.
Ключевая особенность проекта в распределённом режиме для имитации реалистичной нагрузки и интеграция с Grafana/InfluxDB для мониторинга в реальном времени. При этом сценарии можно запускать как консольное приложение или даже как xUnit-тесты в CI/CD.
🤖 GitHub
@csharp_ci
Ключевая особенность проекта в распределённом режиме для имитации реалистичной нагрузки и интеграция с Grafana/InfluxDB для мониторинга в реальном времени. При этом сценарии можно запускать как консольное приложение или даже как xUnit-тесты в CI/CD.
🤖 GitHub
@csharp_ci
4000
16:02
12.05.2025
🛠️ Задача с подвохом: Ленивая инициализация и ловушка многопоточности
Условие:
У вас есть следующий код:
❓ Вопрос:
Сколько раз вы увидите сообщение
🔍 Разбор:
На первый взгляд вы ожидаете, что:
- `Lazy<T>` гарантирует **ленивую инициализацию один раз** даже при многопоточном доступе.
- Сообщение `Initializing HeavyObject...` и конструктор `HeavyObject` сработают только один раз.
Но! Тут есть подвох.
По умолчанию `Lazy<T>` использует **LazyThreadSafetyMode.ExecutionAndPublication**. Это гарантирует, что даже если несколько потоков обращаются к `.Value` одновременно, объект будет инициализирован **только один раз**.
✅ **Ожидаемый вывод:**
- Каждый поток пишет `Accessing HeavyObject...`
- Только один поток пишет `Initializing HeavyObject...` и `HeavyObject created.`
- Остальные потоки дождутся завершения и получат уже готовый объект.
Примерный вывод:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```
🌀 **Подвох, если сменить режим:**
Если вы немного измените код вот так:
```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // без потокобезопасности
);
```
То при **одновременном** доступе к `.Value` вы получите **несколько инициализаций** (по сути гонку потоков).
Примерный вывод может быть таким:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```
Итого объект будет создан несколько раз, что ломает инварианты "Lazy должен создавать объект один раз".
✅ **Вывод:**
• По умолчанию `Lazy<T>` **потокобезопасен**, но важно понимать, что это можно **изменить**.
• При работе с многопоточностью в .NET всегда обращайте внимание на **режим LazyThreadSafetyMode**.
• Даже опытные разработчики могут не заметить подвоха, если кто-то по ошибке или из оптимизаций использует `LazyThreadSafetyMode.None`.
💡 **Бонус-вопрос:**
Что произойдёт, если ваш factory-метод (лямбда) выбросит исключение при инициализации? Как `Lazy<T>` поведёт себя при следующем доступе к?
@ csharp_ci
Условие:
У вас есть следующий код:
using System;
using System.Threading;
class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}
Console.ReadLine();
}
}
class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // эмуляция долгой инициализации
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}
❓ Вопрос:
Сколько раз вы увидите сообщение
Initializing HeavyObject...
и HeavyObject created.
? Почему это может удивить даже опытных .NET разработчиков?🔍 Разбор:
На первый взгляд вы ожидаете, что:
- `Lazy<T>` гарантирует **ленивую инициализацию один раз** даже при многопоточном доступе.
- Сообщение `Initializing HeavyObject...` и конструктор `HeavyObject` сработают только один раз.
Но! Тут есть подвох.
По умолчанию `Lazy<T>` использует **LazyThreadSafetyMode.ExecutionAndPublication**. Это гарантирует, что даже если несколько потоков обращаются к `.Value` одновременно, объект будет инициализирован **только один раз**.
✅ **Ожидаемый вывод:**
- Каждый поток пишет `Accessing HeavyObject...`
- Только один поток пишет `Initializing HeavyObject...` и `HeavyObject created.`
- Остальные потоки дождутся завершения и получат уже готовый объект.
Примерный вывод:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```
🌀 **Подвох, если сменить режим:**
Если вы немного измените код вот так:
```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // без потокобезопасности
);
```
То при **одновременном** доступе к `.Value` вы получите **несколько инициализаций** (по сути гонку потоков).
Примерный вывод может быть таким:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```
Итого объект будет создан несколько раз, что ломает инварианты "Lazy должен создавать объект один раз".
✅ **Вывод:**
• По умолчанию `Lazy<T>` **потокобезопасен**, но важно понимать, что это можно **изменить**.
• При работе с многопоточностью в .NET всегда обращайте внимание на **режим LazyThreadSafetyMode**.
• Даже опытные разработчики могут не заметить подвоха, если кто-то по ошибке или из оптимизаций использует `LazyThreadSafetyMode.None`.
💡 **Бонус-вопрос:**
Что произойдёт, если ваш factory-метод (лямбда) выбросит исключение при инициализации? Как `Lazy<T>` поведёт себя при следующем доступе к
.Value
4000
12:35
10.05.2025
imageИзображение не доступно для предпросмотра
🎨 Fluent.Ribbon — WPF-библиотека для тех, кто скучает по интерфейсам в стиле Microsoft Office. Этот инструмент превратит стандартные окна в полноценную ленточную панель с вкладками, Backstage-меню и Quick Access Toolbar.
Библиотека не просто копирует визуал, а адаптирует его под WPF, сохраняя гибкость: от кастомизации галерей до тонкой настройки всплывающих подсказок. Интересно, что проект живёт уже больше десяти лет и продолжает обновляться — последние версии поддерживают .NET 8 и современные IDE.
🤖 GitHub
@csharp_ci
Библиотека не просто копирует визуал, а адаптирует его под WPF, сохраняя гибкость: от кастомизации галерей до тонкой настройки всплывающих подсказок. Интересно, что проект живёт уже больше десяти лет и продолжает обновляться — последние версии поддерживают .NET 8 и современные IDE.
🤖 GitHub
@csharp_ci
4200
11:02
08.05.2025
imageИзображение не доступно для предпросмотра
💡 13 мая в 20:00 пройдет бесплатный вебинар "Профессиональная архитектура ИИ в Unity". Научим писать гибкий, чистый и мощный ИИ-код, который легко поддерживать и расширять. Запись: https://otus.pw/s6U0p/
😔 Многие Unity-разработчики пишут ИИ через MonoBehaviour и простые скрипты, но в реальных проектах такой подход приводит к хаосу, багам и невозможности масштабирования.
🔊 На интенсиве 13 мая в 20:00 разберём архитектурные паттерны и подходы, которые используют в AAA-студиях и коммерческой разработке.
📖 Основные темы:
- архитектура ИИ
- паттерны (HSM, Behaviour Tree, GOAP)
- поиск пути
Вебинар будет полезен:
- Unity-разработчикам уровня Junior/Junior+
- Middle Unity-разработчика
- Программистам на C#, желающим перейти в GameDev
- Инди-разработчикам
📩 Переходите на сайт, чтобы зарегистрироваться на вебинар 13 мая и получить запись предыдущего вебинара: https://otus.pw/s6U0p/
erid: 2W5zFJoYtit
😔 Многие Unity-разработчики пишут ИИ через MonoBehaviour и простые скрипты, но в реальных проектах такой подход приводит к хаосу, багам и невозможности масштабирования.
🔊 На интенсиве 13 мая в 20:00 разберём архитектурные паттерны и подходы, которые используют в AAA-студиях и коммерческой разработке.
📖 Основные темы:
- архитектура ИИ
- паттерны (HSM, Behaviour Tree, GOAP)
- поиск пути
Вебинар будет полезен:
- Unity-разработчикам уровня Junior/Junior+
- Middle Unity-разработчика
- Программистам на C#, желающим перейти в GameDev
- Инди-разработчикам
📩 Переходите на сайт, чтобы зарегистрироваться на вебинар 13 мая и получить запись предыдущего вебинара: https://otus.pw/s6U0p/
erid: 2W5zFJoYtit
2200
10:02
08.05.2025
close
С этим каналом часто покупают
Отзывы канала
keyboard_arrow_down
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
5.0
0 отзыва за 6 мес.
m
**cromarketing@****.ru
на сервисе с августа 2023
09.07.202407:27
5
Оперативное размещение
Показать еще
Новинки в тематике
Лучшие в тематике
Статистика канала
Рейтинг
44.4
Оценка отзывов
5.0
Выполнено заявок
99
Подписчики:
18.5K
Просмотры на пост:
lock_outline
ER:
11.6%
Публикаций в день:
1.0
CPV
lock_outlineВыбрано
0
каналов на сумму:0.00₽
Подписчики:
0
Просмотры:
lock_outline
Перейти в корзинуКупить за:0.00₽
Комментарий