#SimpleCode - Сергей Журавльёв
6.64K subscribers
24 photos
10 videos
2 files
175 links
Канал о программировании и не только.
Download Telegram
💡 В продолжение темы о вопросах на собеседовании и паттернах, одним из наиболее часто используемых вами паттернов так же является Итератор и вот почему.
Коллекции в C# могут работать с циклом foreach благодаря реализации паттерна Итератор, который, в свою очередь, может быть реализован благодаря тому, что эти коллекции реализуют интерфейсы IEnumerable и IEnumerator. Такой подход даёт возможность, не разбираясь в деталях реализации коллекции, перебирать её элементы в цикле.
🎥 В этом уроке мы разберём цикл foreach на атомы, разберёмся с тем, при чём тут паттерн Итератор, а также с интерфейсы IEnumerable и IEnumerator.
https://www.youtube.com/watch?v=YpRSnUkepv8
🔄 Вернёмся к теме вопросов на job interview!
В продолжение предыдущего поста о паттерне Итератор.
Само собой, вы уже рассказали об интерфейсах IEnumerable и IEnumerator, перечислили методы и свойства интерфейса IEnumerator:
• MoveNext()
• Reset()
• Current
Рассказали, как они работают.
🤔 Логичным будет следующий вопрос:
Что вы знаете про yield?
Уже в следующем уроке мы этот самый yield подробно разберём!
Будут бенчмарки с пруфами!
🔑 А пока, вот основные моменты, которые стоит помнить о yield:
1️⃣ Разворачивается в стейт-машину
При компиляции метод с yield преобразуется в скрытый класс, который управляет состоянием итерации (реализует IEnumerator).
2️⃣ Отложенное выполнение
Код внутри метода с yield не выполняется сразу, а только тогда, когда последовательность начинает перечисляться (например, в цикле foreach).
Это может значительно повысить производительность, так как позволяет получать элементы по одному, а не всю коллекцию сразу. Чем больше элементов в коллекции, тем больше мы выигрываем в производительности.
3️⃣ Эффективное использование памяти
Поскольку элементы обрабатываются по очереди, yield позволяет работать с большими коллекциями, не занимая много оперативной памяти. Это особенно полезно при обработке сотен тысяч объектов, когда нет необходимости хранить всю коллекцию в памяти. Используем меньше памяти. Реже отрабатывает сборщик мусора, что довольно накладно.

З.Ы. На Udemy эта тема уже есть. Там я буду выкладывать всё немного раньше в качестве благодарности за финансовую поддержку. https://www.udemy.com/course/simplecode-cshap/?referralCode=53C0314076F77DCC2A02
В этом уроке мы разберёмся с механизмом отложенного возврата значений yield return, рассмотрим стейт-машину, в которую это всё компилируется, а также с помощью бенчмарков проверим, как использование yield может существенно оптимизировать производительность. https://www.youtube.com/watch?v=aUbFYuBMDqU
🔄 И снова к теме вопросов на job interview!
Одной из ключевых тем собеседования будут вопросы о строках и классе StringBuilder, поскольку знания о них так же охватывают понимание того как устроена работа с памятью в .NET.

🔑 Что следует знать о строках и StringBuilder:
1️⃣ Строки неизменяемы (immutable)
• Когда строки объединяются с помощью оператора + (то есть выполняется конкатенация), происходит создание нового объекта строки в памяти.
• Старые объекты остаются в памяти до сборки мусора (Garbage Collector).

2️⃣ Конкатенация строк в цикле == проблемы с производительностью
• Если конкатенация выполняется внутри цикла, это может сильно замедлить работу программы.
• Причина в том, что строки являются неизменяемыми: на каждой итерации создается новый объект в памяти, а старые объекты ожидают удаления сборщиком мусора, что является дорогостоящей операцией.

3️⃣ Класс StringBuilder решает проблему конкатенации
• StringBuilder использует внутренний изменяемый буфер, что позволяет добавлять, изменять и удалять текст без создания новых объектов.
• Вместо создания нового объекта строки изменения происходят внутри буфера, что позволяет избежать лишних выделений памяти и сборок мусора.

🛠 Когда использовать StringBuilder?
• Если строки изменяются часто (например, в циклах).
• При конкатенации большого количества строк.

📌 Интернирование строк (String Interning)
Отдельным пунктом следует упомянуть о механизме интернирования строк.
• Интернирование строк — это механизм оптимизации памяти, который позволяет хранить только одну копию каждой уникальной строки в специальном пуле строк (intern pool).
• Все литеральные строки (например, "Hello") автоматически интернируются и добавляются в пул строк на этапе компиляции.
• Если создается строка с таким же значением, которое уже есть в пуле, ссылка будет указывать на существующую строку, а не создавать новый объект.
Для поддержания актуальности этого курса разбираемся с тем, куда пропал метод Main и класс Program, а также с тем, что такое Top-level statements. Далее пойдут более интересные технические темы.
З.Ы. Для тех, кто купил этот курс на Udemy, не переживайте — эта тема раскрыта в самом начале курса в видео о том, как создавать проект. (Там заменить устаревшее видео и расширить курс проще, чем на YouTube) https://www.youtube.com/watch?v=iFWcob1ttNg
Вчера весь вечер тестил китайский DeepSeek (если кто не в курсе – аналог ChatGPT). Первые впечатления – довольно неплохо! 🤔
Кажется, он менее осторожен в высказываниях и более прямолинеен в суждениях – наваливает без лишних церемоний. 😎
Тестим дальше.
📢 Запускаем LLM локально за 5 минут! ⚡️
По комментариям под прошлым видео я заметил, что многим интересен запуск больших языковых моделей (LLM) на своём ПК, но не все знают, как это сделать. 🤔
Поэтому вот один из самых простых и быстрых способов! 🚀 Запускаем DeepSeek R1 локально с помощью LM Studio. 🔧💻 https://www.youtube.com/watch?v=UPdtp4l7IjE
В этом видео разберёмся с делегатами в C# – что это такое, как они работают и зачем нужны. Рассмотрим встроенные делегаты Func и Action, а также их связь с LINQ и лямбда-выражениями. Покажу примеры использования, создание собственных делегатов и работу с Multicast Delegate. https://www.youtube.com/watch?v=vkOnfEn8tFU