C# (C Sharp) programming
18.7K subscribers
757 photos
38 videos
8 files
675 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:


Машинное обучение: @ai_machinelearning_big_data
Go: @Golang_google
C#: @csharp_1001_notes
Базы данных: @sqlhub
Python: @pythonl
C/C++/: @cpluspluc
Data Science: @data_analysis_ml
Devops: @devOPSitsec
Rust: @rust_code
Javascript: @javascriptv
React: @react_tg
PHP: @phpshka
Docker: @docker
Android: @android_its
Мобильная разработка: @mobdevelop
Linux: linuxacademy
Big Data: t.iss.one/bigdatai
Хакинг: @linuxkalii
Java:@javatg
Собеседования: @machinelearning_interview


💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy

🔥ИТ-Мемы: t.iss.one/memes_prog

🇬🇧Английский: @english_forprogrammers
Media is too big
VIEW IN TELEGRAM
🖥 Запуск ASP.NET Core + PostgreSQL | Docker Compose

Наглядный по работе docker-compose.

📌 Источник

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Redis Explained

Глубокое техническое погружение во все тонкости Redis.

В статье рассматриваются различные топологии Redis, персистентность данных и форкинг процессов.

Отличная иллюстрированная статья для глубокого понимания Redis.

Читать

@csharp_ci
🟡 Дайджест полезных материалов из мира :C# за неделю

Почитать:
UI Router в Unity + CustomEditor
Преимущества функционального программирования на примерах C#
Объяснения по шардинга баз данных
Реализация обмена сообщениями через MassTransit
Конкурентная очередь с приоритетами (неудачно)
Бессильный сборщик мусора или неуправляемая память в .NET
Unity: Как реализовать бесконечный ListView с изображениями?
ChatGPT в написании юнит тестов
Robust use of HTTP Client
How to deploy a BLAZOR WASM Web Application to GitHub Page
Intelligent Queries By Entity Intelligence
Boost your productivity in Visual Studio - Shortcuts
Dealing with C# & GitHub Copilot in Visual Studio 2022
Working with C# in VS Code.
Game Dev Digest — Issue #200 - Develop Faster
Time Period Library for .NET
Wie man in C#/VB.NET die Hintergrundfarbe und das Hintergrundbild von PDF-Dokumenten festlegt
[C#/VB.NET] Hintergrundfarbe von Absätzen und Text in Word-Dokumenten festlegen

Посмотреть:
🌐On .NET Live - Building web apps with Blazor and Spark.NET
🌐 Сравнение Unity и Unreal Engine: Что выбрать новичку?

Хорошего дня!

@csharp_ci
Сapa

capa - полезный инструмент с открытым исходным кодом для определения возможностей в исполняемых файлах.

Вы запускаете ее для PE, ELF, .NET файла или шелл-кода, и он говорит вам, что, по его мнению, может сделать программа.

Например, можно предположить, что файл является бэкдором, способен устанавливать службы или использует HTTP для запросов.

Github
Установка

@csharp_ci
Продвинутые случи использования ограничении частоты запросов в .NET

Вот как определить ограничения, вызвав метод AddTokenBucketLimiter (картинка 1)

Ограничение пользователей по IP-адресам (картинка 2)

Ограничение с учетом прокси.(картинка 3)

Ограничение пользователей по идентификационным признакам (картинка 4)

Реализация ограничение на обратном прокси с помощью YARP, необходимо картинка 5)

📌 Читать статью

@csharp_ci
🚀Паттерн проектирования Singleton в C#: Полное руководство

Singleton - порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр некоторого класса, и предоставляющий глобальную точку доступа к этому экземпляру.

Когда надо использовать Синглтон? Когда необходимо, чтобы для класса существовал только один экземпляр

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

Классическая реализация данного шаблона проектирования на C# выглядит следующим образом:

class Singleton
{
private static Singleton instance;

private Singleton()
{}

public static Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}

В классе определяется статическая переменная - ссылка на конкретный экземпляр данного объекта и приватный конструктор. В статическом методе getInstance() этот конструктор вызывается для создания объекта, если, конечно, объект отсутствует и равен null.

Для применения паттерна Одиночка создадим небольшую программу. Например, на каждом компьютере можно одномоментно запустить только одну операционную систему. В этом плане операционная система будет реализоваться через паттерн синглтон:

class Program
{
static void Main(string[] args)
{
Computer comp = new Computer();
comp.Launch("Windows 8.1");
Console.WriteLine(comp.OS.Name);

// у нас не получится изменить ОС, так как объект уже создан
comp.OS = OS.getInstance("Windows 10");
Console.WriteLine(comp.OS.Name);

Console.ReadLine();
}
}
class Computer
{
public OS OS { get; set; }
public void Launch(string osName)
{
OS = OS.getInstance(osName);
}
}
class OS
{
private static OS instance;

public string Name { get; private set; }

protected OS(string name)
{
this.Name=name;
}

public static OS getInstance(string name)
{
if (instance == null)
instance = new OS(name);
return instance;
}
}

Синглтон и многопоточность
При применении паттерна синглтон в многопоточным программах мы можем столкнуться с проблемой, которую можно описать следующим образом:

static void Main(string[] args)
{
(new Thread(() =>
{
Computer comp2 = new Computer();
comp2.OS = OS.getInstance("Windows 10");
Console.WriteLine(comp2.OS.Name);

})).Start();

Computer comp = new Computer();
comp.Launch("Windows 8.1");
Console.WriteLine(comp.OS.Name);
Console.ReadLine();
}

Здесь запускается дополнительный поток, который получает доступ к синглтону. Параллельно выполняется тот код, который идет запуска потока и кторый также обращается к синглтону. Таким образом, и главный, и дополнительный поток пытаются инициализровать синглтон нужным значением - "Windows 10", либо "Windows 8.1". Какое значение сиглтон получит в итоге, пресказать в данном случае невозможно.

Вывод программы может быть такой:

Windows 8.1
Windows 10
Или такой:

Windows 8.1
Windows 8.1

В итоге мы сталкиваемся с проблемой инициализации синглтона, когда оба потока одновременно обращаются к коду:

if (instance == null)
instance = new OS(name);

Чтобы решить эту проблему, перепишем класс синглтона следующим образом:


class OS
{
private static OS instance;

public string Name { get; private set; }
private static object syncRoot = new Object();

protected OS(string name)
{
this.Name = name;
}

public static OS getInstance(string name)
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new OS(name);
}
}
return instance;
}
}

Чтобы избежать одновременного доступа к коду из разных потоков критическая секция заключается в блок lock.

📌 Статья

@csharp_ci
RISC-V formal ISA Specification

Очень интересный проект, который показывает элегантность и выразительность F# – формальная (и исполняемая) спецификация для RISC-V ISA, написанная в функциональном стиле.

Авторы демонстрируют «чрезвычайно элементарную» реализацию F#, чтобы сделать ее читаемой и пригодной для широкой аудитории.

Github
ISA инструкции

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥SharpShellPipe

Это легковесное приложение на C#, которое осуществляет интерактивный удаленный shell доступ через именованный канал и протокол SMB.

Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Путь к Инновационному Тестированию с Selenium и C#: Мастерство и Качество

Роль Selenium и C# в создании надежных автоматизированных тестов
Представьте, что автоматизированные тесты - это специальные инструменты, которые помогают проверить, работает ли программа правильно. Такие тесты особенно полезны для веб-сайтов, и вот почему.

Selenium - это как мощный детектив, который может заметить, что происходит на веб-странице. Он может найти кнопки, текстовые поля, выпадающие списки и многое другое. А C# - это язык, на котором можно "разговаривать" с Selenium и давать ему команды.

Вместе Selenium и C# - как динамичный дуэт. Они позволяют нам создавать тесты, которые будут проверять веб-сайт на ошибки. Например, мы можем сказать, чтобы они "нажали" кнопку "Войти" и проверили, что после этого появится правильное сообщение. Это как если бы вы проверяли, что все кнопки на вашем пульте дистанционного управления работают правильно.

Манипуляция с веб-элементами
При создании надежных автоматизированных тестов необходимо взаимодействовать с веб-элементами, такими как кнопки, текстовые поля и выпадающие списки. В этом процессе Selenium предоставляет инструменты для поиска и взаимодействия с элементами на странице, а C# дает возможность эффективно управлять этими элементами.

Клик на кнопку "Войти" на странице авторизации

IWebElement loginButton = driver.FindElement(By.Id("login-button"));
loginButton.Click();

Ввод текста в поле для поиска

IWebElement searchBox = driver.FindElement(By.Name("search"));
searchBox.SendKeys("Selenium testing");

Выбор опции "Черный" из выпадающего списка цветов

IWebElement colorDropdown = driver.FindElement(By.Id("color-selector"));
SelectElement colorSelect = new SelectElement(colorDropdown);
colorSelect.SelectByText("Черный");

Вход на сайт и проверка успешной авторизации

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

[TestFixture]
public class LoginTests
{
IWebDriver driver;

[SetUp]
public void SetUp()
{
driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.example.com/login");
}

[Test]
public void TestSuccessfulLogin()
{
IWebElement usernameInput = driver.FindElement(By.Id("username"));
IWebElement passwordInput = driver.FindElement(By.Id("password"));
IWebElement loginButton = driver.FindElement(By.Id("login-button"));

usernameInput.SendKeys("myUsername");
passwordInput.SendKeys("myPassword");
loginButton.Click();

IWebElement welcomeMessage = driver.FindElement(By.CssSelector(".welcome-message"));
Assert.AreEqual("Welcome, User!", welcomeMessage.Text);
}

[TearDown]
public void TearDown()
{
driver.Quit();
}
}


📌 Читать дальше

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Вопросы и ответы на собеседовании по C# многопоточности

В этой статье вы найдете полную подборку вопросов для собеседования по многопоточности C#, которые не только проверят ваше знание предмета, и обеспечат хорошую подготовку к следующему техническому собеседованию.

📌 Читать

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотите бесплатно изучить чистой архитектуры?

Первое, что необходимо понимать — приложения, созданные с помощью принципов чистой архитектуры, обладают высокой устойчивостью к изменениям. Они быстро адаптируются к новым требованиям и возможностям, сохраняя при этом высокое качество кода и производительность. Кроме того, система становится гораздо проще для понимания и сопровождения, что делает ее более доступной для других разработчиков.

Принципы чистой архитектуры также помогают избежать проблем с зависимостями и разделить приложение на логические блоки. Это повышает удобство добавления новых функций и изменения уже существующих. В результате, время разработки сокращается, а приложение становится более гибким и масштабируемым.

Какие преимущества могут дать принципы Clean Architecture :

Улучшение качества кода;

Быстрая адаптация к изменениям и новым функциям;

Удобство сопровождения и расширения приложений;

Минимизация проблем с зависимостями;

Повышение гибкости и масштабируемости приложений;

Сокращение времени разработки и улучшение производительности.

Все эти пункты дают принципам чистой архитектуры важное преимущество в сравнении с другими методиками разработки.

Представляем вам список из 45 полезных уроков, разбитых по темам.🔥

𝗖𝗹𝗲𝗮𝗻 𝗔𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲 𝗙𝘂𝗻𝗱𝗮𝗺𝗲𝗻𝘁𝗮𝗹𝘀
- Project setup
- Minimal APIs - https://youtu.be/GCuVC_qDOV4
- Dependency injection - https://youtu.be/tKEF6xaeoig
- CA + Document database - https://youtu.be/Ru6_b50wdfo
- Project setup from scratch - https://youtu.be/fe4iuaoxGbA
- 4 Best practices for new project - https://youtu.be/B9ZUJN1Juhk
- Structured logging - https://youtu.be/nVAkSBpsuTk
- Message queues - https://youtu.be/CTKWFMZVIWA

𝗗𝗼𝗺𝗮𝗶𝗻-𝗗𝗿𝗶𝘃𝗲𝗻 𝗗𝗲𝘀𝗶𝗴𝗻 𝗜𝗻𝘁𝗿𝗼𝗱𝘂𝗰𝘁𝗶𝗼𝗻

- Rich Domain model - https://youtu.be/1Lcr2c3MVF4
- Entities - https://youtu.be/00tCda35Bvk
- Value objects - https://youtu.be/P5CRea21R2E
- Aggregate root - https://youtu.be/0D3EB2jvQ44
- Domain validation - https://youtu.be/KgfzM0QWHrQ
- Domain model tradeoffs - https://youtu.be/eC7GMGIR4Gw
- Repository pattern - https://youtu.be/h4KIngWVpfU
- Specification pattern - https://youtu.be/rdY5ElleWKY
- Unit of work - https://youtu.be/vN_j1Bs0ALU
- Smart Enums - https://youtu.be/v6cYTcEfZ8A
- Snapshot pattern - https://youtu.be/HhZ4DtON404
- Strongly typed IDs - https://youtu.be/LdrMdIabE1o
- Anemic Domain model - https://youtu.be/6gwIDiUk2h4
- DDD modeling - https://youtu.be/fO2T5tRu3DE
- DDD + EF mapping - https://youtu.be/IlXnIe6p_Uk
- Incomplete aggregates - https://youtu.be/cCnZJE0wEjY
- Double dispatch - https://youtu.be/wi_wsw5Gp6Q

𝗖𝗤𝗥𝗦

- CQRS Fundamentals - https://youtu.be/vdi-p9StmG0
- Validation /w Result - https://youtu.be/85dxwd8HzEk
- Validation /w Exception - https://youtu.be/OhQA4PDdp0Q
- Read models - https://youtu.be/AVBAAKa84cs
- UoW pipeline - https://youtu.be/sSIg3fpflI0
- The "Truth" on CQRS - https://youtu.be/F3xNCfP3Xew
- CQRS Query side - https://youtu.be/RgqCavV2cqQ
- Materialized views - https://youtu.be/2ZNMlx44gKQ

𝗧𝗲𝘀𝘁𝗶𝗻𝗴
- Parameterized tests - https://youtu.be/Pk2d-qm5KwE
- Unit testing - https://youtu.be/a6Qab5l-VLo
- Integration testing /w Docker - https://youtu.be/tj5ZCtvgXKY
- Architecture tests - https://youtu.be/_D6Kai4RdGY

𝗗𝗲𝘀𝗶𝗴𝗻 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀
- Idempotent consumer - https://youtu.be/mGeEtokcjVQ
- Saga pattern - https://youtu.be/dlXCodLxhag
- Compensating transaction (Saga) - https://youtu.be/FPVzevl6Ri8
- Domain events - https://youtu.be/AHzWJ_SMqLo
- Domain vs. Integration event - https://youtu.be/K806a-rWE2g
- Options pattern - https://youtu.be/wxYt0motww0
- Options pattern validation - https://youtu.be/qRruEdjNVNE
- Decorator pattern - https://youtu.be/i_3I6XLAOt0

@csharp_ci