fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

C# | Вопросы собесов

C# | Вопросы собесов

رفتن به کانال در Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

نمایش بیشتر
5 009
مشترکین
-124 ساعت
-27 روز
+1730 روز
آرشیو پست ها
🤔 Что такое предикат? Это делегат, представляющий метод, который принимает один или несколько аргументов и возвращает логическое значение (true или false). Предикаты часто используются для фильтрации коллекций, поиска элементов и других операций, связанных с условными проверками. 🚩Особенности 🟠Тип делегата В C# предикат представлен делегатом Predicate<T>, который принимает один аргумент типа T и возвращает bool. 🟠Использование Предикаты обычно используются в методах стандартных коллекций, таких как List<T>, для поиска, удаления и фильтрации элементов. 🚩Пример использования предиката Определение предиката
public static bool IsEven(int number)
{
    return number % 2 == 0;
}
Использование предиката с методом коллекции
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // Использование предиката для поиска первого четного числа
        int firstEven = numbers.Find(IsEven);
        Console.WriteLine("First even number: " + firstEven);

        // Использование предиката для удаления всех четных чисел
        numbers.RemoveAll(IsEven);
        Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
    }

    public static bool IsEven(int number)
    {
        return number % 2 == 0;
    }
}
🚩Лямбда-выражения как предикаты Лямбда-выражения часто используются для определения предикатов непосредственно в месте вызова метода. Это делает код более компактным и удобочитаемым. Пример использования лямбда-выражений
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // Использование лямбда-выражения для поиска первого четного числа
        int firstEven = numbers.Find(n => n % 2 == 0);
        Console.WriteLine("First even number: " + firstEven);

        // Использование лямбда-выражения для удаления всех четных чисел
        numbers.RemoveAll(n => n % 2 == 0);
        Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
    }
}
🚩Сценарии использования предикатов 🟠Фильтрация коллекций Предикаты используются для определения условий фильтрации элементов в коллекциях.
List<int> evenNumbers = numbers.FindAll(IsEven);   
🟠Поиск элементов Предикаты помогают находить элементы, соответствующие определенному условию.
int firstEven = numbers.Find(IsEven);   
🟠Удаление элементов Предикаты используются для удаления элементов, соответствующих определенному условию.
numbers.RemoveAll(IsEven);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие есть способы (протоколы) обмена данными между сервером и клиентом? - HTTP/HTTPS — основной протокол для REST API, веба. - WebSocket — для двустороннего постоянного соединения. - gRPC — высокопроизводительный бинарный протокол на базе HTTP/2. - SOAP — устаревший, но формализованный протокол обмена XML. - MQTT, AMQP — легкие брокерные протоколы (например, для IoT). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какой слой rest и swap с точки зрения трехслойной архитектуры? В трехслойной архитектуре (трехуровневая архитектура), также известной как многоуровневая архитектура, приложения разделяются на три логических слоя: 🟠Презентационный слой (Presentation Layer) Отвечает за взаимодействие с пользователем. Веб-интерфейсы, мобильные приложения, десктопные приложения. Примеры: HTML/CSS/JavaScript для веб-приложений, UI-компоненты в мобильных и десктопных приложениях. 🟠Логический слой (Business Logic Layer) Содержит бизнес-логику и правила приложения. Обрабатывает данные, выполняет вычисления, применяет бизнес-правила. Примеры: классы и методы, реализующие бизнес-логику, сервисы, обработчики данных. 🟠Слой данных (Data Access Layer): Отвечает за взаимодействие с источниками данных. Операции с базами данных, файловыми системами, внешними сервисами. Примеры: репозитории, Data Access Objects (DAO), API-клиенты для доступа к внешним системам. 🚩REST REST — это архитектурный стиль для разработки веб-сервисов. RESTful сервисы используют стандартные HTTP методы (GET, POST, PUT, DELETE и т.д.) для работы с ресурсами. С точки зрения трехслойной архитектуры: Презентационный слой: Вызовы REST API могут происходить с клиентской стороны (например, AJAX запросы из веб-интерфейса) или через клиентские приложения. Пример: фронтенд веб-приложения, который взаимодействует с REST API. Логический слой: REST API реализует бизнес-логику и выступает посредником между презентационным слоем и слоем данных. Пример: контроллеры и сервисы, обрабатывающие REST запросы и выполняющие соответствующую бизнес-логику. Слой данных: REST API может взаимодействовать с базой данных или другими источниками данных для получения и сохранения информации. Пример: методы в API, которые выполняют запросы к базе данных через репозитории или DAO. 🚩SWAP SWAP — это гипотетический или менее распространенный термин, часто интерпретируемый как упрощенный API для веб-приложений. Презентационный слой Клиентские приложения или пользовательские интерфейсы могут вызывать методы SWAP для получения или отправки данных.Пример: веб-страницы или мобильные приложения, обращающиеся к SWAP для выполнения операций. Логический слой: SWAP обрабатывает бизнес-логику аналогично REST API, предоставляя упрощенные конечные точки для взаимодействия с данными. Пример: сервисы, которые реализуют простые операции (CRUD) без сложной бизнес-логики. Слой данных: SWAP взаимодействует с базой данных или другими источниками данных для выполнения операций чтения/записи. Пример: методы SWAP, которые обращаются к базе данных через абстрактные уровни доступа к данным. Ставь 👍 и забирай 📚 Базу знаний

🤔 Всегда ли нужно нормализовывать данные? Нет, не всегда. Полная нормализация может усложнить архитектуру и замедлить чтение данных из-за большого числа JOIN'ов. Поэтому часто применяют компромисс между нормализацией и денормализацией, особенно в high-load системах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Есть ли разница в какой последовательности писать catch-и? Да, порядок catch имеет значение! Исключения проверяются сверху вниз, и первый подходящий catch будет выполнен. 🚩Как работает `catch`? 1. Исключение проверяется по порядку catch-блоков. 2. Если catch подходит → он выполняется, остальные игнорируются. 3. Специфичные исключения (DivideByZeroException) нужно ставить выше общих (Exception). 🚩Ошибка: общий `catch` выше специфичных Так делать нельзя!
try
{
    int x = 5 / 0; // Ошибка
}
catch (Exception ex) // Ловит все исключения
{
    Console.WriteLine("Общая ошибка");
}
catch (DivideByZeroException ex) // Никогда не выполнится!
{
    Console.WriteLine("Деление на ноль!");
}
Правильный порядок catch
try
{
    int x = 5 / 0;
}
catch (DivideByZeroException ex) // Специфичный `catch` первым
{
    Console.WriteLine("Ошибка: деление на ноль!");
}
catch (Exception ex) // Общий `catch` внизу
{
    Console.WriteLine("Произошла ошибка!");
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какой смысл жить в нулевом поколении и надолго ли продлится жизнь? Смысл — в оптимизации работы сборщика мусора (GC): - Сборка мусора чаще всего затрагивает именно Generation 0, потому что большинство объектов живут недолго. - Если объект "пережил" сборку — он перемещается в следующее поколение (Gen 1, затем Gen 2). - Это уменьшает нагрузку на сборщик, ведь старые объекты проверяются реже. Таким образом, жизнь в Gen 0 коротка, если объект быстро умирает. Но если нужен — он "повзрослеет". Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое IEnumerable? IEnumerable — это интерфейс в базовой библиотеке классов .NET Framework, который определяет один метод: GetEnumerator(). Этот метод возвращает объект IEnumerator, который позволяет перебирать элементы коллекции (например, массива или списка) один за другим. 🚩Зачем он нужен? Используется для создания универсального метода перебора данных, не зависящего от типа коллекции. Это означает, что любой тип данных, который реализует IEnumerable, можно перебирать с помощью цикла foreach в C#. Это упрощает работу с различными структурами данных, предоставляя единый механизм для итерации элементов. 🚩Как он используется? Когда вы реализуете интерфейс IEnumerable в своём классе, вы обязуете этот класс предоставлять метод GetEnumerator(), который возвращает IEnumerator. IEnumerator, в свою очередь, имеет методы для перехода к следующему элементу (MoveNext) и для получения текущего элемента (Current), а также метод Reset(), который возвращает перечислитель в начальное состояние.
using System;
using System.Collections;

public class DaysOfWeek : IEnumerable
{
    private string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

    public IEnumerator GetEnumerator()
    {
        for (int index = 0; index < days.Length; index++)
        {
            // Yield each day of the week.
            yield return days[index];
        }
    }
}

public class Program
{
    public static void Main()
    {
        DaysOfWeek daysOfWeek = new DaysOfWeek();
        foreach (string day in daysOfWeek)
        {
            Console.WriteLine(day);
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какая разница между private и protected методами? - private — доступен только внутри текущего класса. - protected — доступен внутри текущего класса и его наследников. private обеспечивает максимальную инкапсуляцию, а protected позволяет наследникам переопределять поведение или использовать базовые методы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🎉Разыгрываем пожизненный доступ к AI-ассистенту для поиска работы для 3 подписчиков До запуска Софи остается меньше месяца,
🎉Разыгрываем пожизненный доступ к AI-ассистенту для поиска работы для 3 подписчиков До запуска Софи остается меньше месяца, поэтому мы решили порадовать вас и устроить конкурс, приуроченный к этому событию. Кто такая Софи? Это первый в России ассистент по поиску работы, который будет сам делать отклики, писать сопроводительные письма, поможет с резюме и подготовкой к собесу, а еще избавит тебя от отказов. Мы работали над ней более полугода, и сейчас хотим подарить бесплатный пожизненный доступ для 3 наших подписчиков. Мы посчитали, стоимость одной такой подписки ну хотя бы на 10 лет составляла бы 420.000 руб. Условия конкурса простые: 1. Подписаться на 4 наших канала: Софи и партнёры Young & Junior - вакансии IT Young Стажёр - стажировки ИТ IT мероприятия для стажеров и студентов 2. Нажать кнопку "участвую" под этим постом. 15 июля, в 19:00, мы в прямом эфире проведем запуск Софи, а в 20:00 опубликуем результаты конкурса в канале Софи и Партнёры. Каждый победитель получит бесплатный доступ к Софи навсегда. Всем удачи и до встречи в прямом эфире🚀

🤔 В чем отличие slim версий от обычных семафоров? Semaphore – классический семафор, использующий ядро операционной системы для синхронизации потоков. SemaphoreSlim – более лёгкая и быстрая версия, работающая в основном на уровне управляемого кода без вызовов ядра ОС. 🚩Когда использовать `Semaphore`, а когда `SemaphoreSlim`? Используйте Semaphore, если: Вам нужно разделение ресурсов между разными процессами. Вы работаете с нативным кодом или сторонними API, использующими семафоры ОС. Используйте SemaphoreSlim, если: Вам нужна быстрая блокировка между потоками в одном процессе. Вы хотите использовать асинхронный код (async/await). Вам важна производительность. 🚩Пример использования `Semaphore` (между процессами и потоками)
using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(2, 2); // Макс. 2 потока могут войти одновременно

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            new Thread(DoWork).Start(i);
        }
    }

    static void DoWork(object id)
    {
        Console.WriteLine($"Поток {id} ждёт семафор...");
        semaphore.WaitOne(); // Захватываем семафор

        Console.WriteLine($"Поток {id} выполняет работу...");
        Thread.Sleep(2000); // Симуляция работы

        Console.WriteLine($"Поток {id} освобождает семафор");
        semaphore.Release(); // Освобождаем семафор
    }
}
🚩Пример использования `SemaphoreSlim` (быстрее, поддерживает `async/await`)
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2); // 2 потока одновременно

    static async Task Main()
    {
        Task[] tasks = new Task[5];
        for (int i = 0; i < 5; i++)
        {
            tasks[i] = DoWork(i);
        }
        await Task.WhenAll(tasks);
    }

    static async Task DoWork(int id)
    {
        Console.WriteLine($"Задача {id} ждёт семафор...");
        await semaphoreSlim.WaitAsync(); // Асинхронное ожидание

        Console.WriteLine($"Задача {id} выполняет работу...");
        await Task.Delay(2000); // Симуляция работы

        Console.WriteLine($"Задача {id} освобождает семафор");
        semaphoreSlim.Release(); // Освобождаем семафор
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем отличается IQueryable от IEnumerable? `IEnumerable` используется для перебора коллекции в памяти и поддерживает ленивую загрузку данных. `IQueryable` позволяет работать с данными на уровне источника данных, поддерживая отложенное выполнение запросов и возможность составления SQL-запросов для баз данных. `IQueryable` чаще используется в LINQ для работы с базами данных, а `IEnumerable` — для работы с коллекциями, уже загруженными в память. `IQueryable` может оптимизировать запросы, выполняя их на сервере базы данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое веб сокеты? Это технология, обеспечивающая двустороннюю связь между клиентом и сервером через один TCP-соединение. В отличие от традиционного HTTP, который работает по принципу запрос-ответ, WebSockets позволяют передавать данные в обоих направлениях в режиме реального времени, что делает их идеальными для приложений, требующих мгновенного обмена данными. 🚩Характеристики 🟠Двусторонняя связь Клиент и сервер могут отправлять данные друг другу независимо, без необходимости инициировать новый запрос. 🟠Постоянное соединение После установления WebSocket-соединение остается открытым, что позволяет передавать данные с минимальной задержкой. 🟠Эффективность Меньшие накладные расходы по сравнению с HTTP, так как заголовки передаются только при установлении соединения, а не для каждого сообщения. 🟠Масштабируемость Поддержка большого количества одновременных соединений, что полезно для чатов, игр и других приложений с интенсивным обменом данными. 🚩Как работают 1⃣Установка соединения Клиент инициирует соединение с сервером через HTTP-запрос с заголовком Upgrade, указывая, что он хочет перейти на WebSocket-протокол. 2⃣Рукопожатие (handshake) Сервер отвечает согласием на переход на WebSocket-протокол, и соединение устанавливается. 3⃣Обмен данными После установления соединения данные могут передаваться в обоих направлениях до тех пор, пока одно из сторон не закроет соединение. 🚩Пример использования Сервер на Python с использованием библиотеки websockets
import asyncio
import websockets

async def handler(websocket, path):
    async for message in websocket:
        print(f"Received message: {message}")
        await websocket.send(f"Echo: {message}")

start_server = websockets.serve(handler, "localhost", 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Клиент на JavaScript
const socket = new WebSocket('ws://localhost:8765');

socket.onopen = function(event) {
    console.log('WebSocket is open now.');
    socket.send('Hello, Server!');
};

socket.onmessage = function(event) {
    console.log(`Message from server: ${event.data}`);
};

socket.onclose = function(event) {
    console.log('WebSocket is closed now.');
};

socket.onerror = function(error) {
    console.log(`WebSocket error: ${error}`);
};
🚩Плюсы ➕Реальное время Подходит для приложений, где важна минимальная задержка, таких как чаты, игровые приложения и финансовые торговые платформы. ➕Меньшие накладные расходы Меньшее количество данных передается по сети по сравнению с традиционными HTTP-запросами. ➕Удобство Простота в использовании и поддержка большинством современных браузеров. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие минусы есть у индексов с точки зрения оптимизации? Индексы занимают дополнительное место на диске и в памяти. Они замедляют операции вставки, обновления и удаления, так как каждый раз требуется обновлять индекс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Может ли pipeline не обрабатывать HTTP запросы? Да, Pipeline может не обрабатывать HTTP-запросы, если: Запрос был остановлен раньше (например, с UseMiddleware или Use без вызова next()). Некорректная маршрутизация (запрос не соответствует ни одному маршруту). Фильтрация запроса (например, через UseWhen или MapWhen). Ошибка в middleware (исключение без обработки). 🚩Что такое `Pipeline` в ASP.NET Core? В ASP.NET Core конвейер обработки запросов (Pipeline) состоит из **middleware-компонентов, которые могут изменять или перенаправлять запрос.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.Use(async (context, next) =>
{
    Console.WriteLine("Middleware 1: До запроса");
    await next(); // Передача дальше
    Console.WriteLine("Middleware 1: После запроса");
});

app.Run(async (context) =>
{
    Console.WriteLine("Middleware 2: Обработка запроса");
    await context.Response.WriteAsync("Ответ от сервера");
});

app.Run();
🚩Как `Pipeline` может не обработать HTTP-запрос? Middleware останавливает запрос (next() не вызывается Если в Middleware не вызвать next(), то дальнейшие обработчики не выполнятся.
app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Запрос остановлен.");
    // next() НЕ вызывается, запрос не проходит дальше
});
🚩Запрос не попадает ни в один обработчик Если Pipeline настроен неправильно, запрос может не попасть ни в один обработчик.
app.UseRouting(); // Включает маршрутизацию, но маршруты не настроены!

app.UseEndpoints(endpoints =>
{
    // Здесь НЕТ ни одного маршрута!
});

app.Run();
🚩Использование `UseWhen` или `MapWhen` для фильтрации запросов Методы UseWhen и MapWhen позволяют разделять обработку запросов.
app.MapWhen(context => context.Request.Path == "/special", appBranch =>
{
    appBranch.Run(async context =>
    {
        await context.Response.WriteAsync("Специальный маршрут");
    });
});

// Основной обработчик
app.Run(async context =>
{
    await context.Response.WriteAsync("Обычный маршрут");
});
🚩Ошибка в Middleware Если в middleware возникает необработанное исключение, то Pipeline прерывается.
app.Use(async (context, next) =>
{
    throw new Exception("Ошибка!");
    await next(); // Код ниже не выполнится
});
Правильный способ
app.UseExceptionHandler("/error");

app.Run(async context =>
{
    await context.Response.WriteAsync("Основной обработчик");
});
Ставь 👍 и забирай 📚 Базу знаний

🐢 Столкнулись с «тормозным» C#-кодом? Медленные алгоритмы могут растянуть выполнение задачи на минуты вместо миллисекунд. 📅
🐢 Столкнулись с «тормозным» C#-кодом? Медленные алгоритмы могут растянуть выполнение задачи на минуты вместо миллисекунд. 📅 Приглашаем на открытый урок «Анализ сложности алгоритмов и сортировка на C#» 3 июля в 20:00 МСК. Разберём, что такое Big O, какие факторы влияют на скорость, и на практике напишем пузырьковую, вставками и другие сортировки. Вы увидите, как измерять время выполнения, сравнивать производительность и выбирать самый эффективный алгоритм. После занятия ваш код станет быстрее, а техническое интервью — проще. Регистрируйтесь сейчас — урок проходит перед стартом курса «C# Developer»: https://otus.pw/rqcD/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низки
Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низкие баллы? У нас есть решение для вас! Институт Международных Экономических Связей предлагает дистанционное обучение , которое позволяет получать качественные знания из любой точки мира по 10+ направлениям обучения. ✅ Государственный диплом без отметки о дистанте ✅ Удобный личный кабинет студента ✅ Поддержка кураторов на каждом этапе обучения ✅ Можно поступить без ЕГЭ Узнать больше #реклама 16+ imes.su О рекламодателе

🤔 Как работают дженерики под капотом? Дженерики (Generics) — это шаблоны, которые компилируются один раз, но адаптируются под разные типы: - Для значимых типов компилятор создаёт отдельные версии (специализации) — для повышения производительности и избежания boxing. - Для ссылочных типов — используется единая реализация, потому что ссылки можно привести к общему типу. Это делает дженерики мощными и безопасными, при этом эффективными. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как выглядит using после компеляции? В C# using используется для автоматического освобождения ресурсов. Гарантирует вызов Dispose() у объекта, реализующего IDisposable. После компиляции using превращается в try-finally, где finally вызывает Dispose(). 🚩1. `using` → `try-finally` Код с using
using (var file = new StreamWriter("file.txt"))
{
    file.WriteLine("Привет, мир!");
}
После компиляции превращается в
StreamWriter file = new StreamWriter("file.txt");
try
{
    file.WriteLine("Привет, мир!");
}
finally
{
    if (file != null)
        file.Dispose(); // Автоматический вызов Dispose()
}
🚩`using` с `IAsyncDisposable` (C# 8+) Для асинхронного освобождения ресурсов (DisposeAsync()). Код с await using
await using (var file = new AsyncResource())
{
    await file.DoSomethingAsync();
}
После компиляции превращается в:
var file = new AsyncResource();
try
{
    await file.DoSomethingAsync();
}
finally
{
    if (file != null)
        await file.DisposeAsync();
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие есть базовые делегаты в .NET и в чём их различия? Основные обобщённые делегаты: - Action — делегат, который не возвращает значение, но может принимать параметры. - Func — делегат, который возвращает значение и может принимать параметры. - Predicate — делегат, который принимает один параметр и возвращает bool (подтип Func). Различие — в наличии/отсутствии возвращаемого значения и типах параметров. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое post? post чаще всего ассоциируется с HTTP POST-запросами, которые используются для отправки данных на сервер. Это один из основных методов HTTP-протокола наряду с GET, PUT, DELETE и другими. 🚩Основные понятия 🟠HTTP POST-запрос Метод HTTP, используемый для отправки данных на сервер. Обычно применяется для создания новых ресурсов или передачи данных, которые могут изменять состояние сервера. 🟠Отправка данных Данные могут быть отправлены в теле запроса в различных форматах, таких как JSON, XML или обычный текст. 🟠Использование в веб-приложениях POST-запросы широко используются в веб-приложениях для передачи данных от клиента к серверу, например, при отправке формы, загрузке файлов или выполнении AJAX-запросов. 🚩Пример использования HTTP POST-запроса Для выполнения HTTP POST-запроса в C# часто используется класс HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами. 🚩Пример отправки JSON-данных 1⃣Настройка проекта Убедитесь, что в вашем проекте установлен пакет System.Net.Http (обычно он включен по умолчанию в .NET Core проектах). 2⃣Отправка POST-запроса
   using System;
   using System.Net.Http;
   using System.Text;
   using System.Threading.Tasks;

   class Program
   {
       static async Task Main(string[] args)
       {
           // Создаем HttpClient
           using (HttpClient client = new HttpClient())
           {
               // URL-адрес, на который отправляется запрос
               string url = "https://example.com/api/resource";

               // Данные для отправки
               var data = new
               {
                   Name = "John Doe",
                   Age = 30
               };

               // Сериализуем данные в JSON
               string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);

               // Создаем содержимое запроса
               StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");

               // Отправляем POST-запрос
               HttpResponseMessage response = await client.PostAsync(url, content);

               // Проверяем успешность ответа
               if (response.IsSuccessStatusCode)
               {
                   Console.WriteLine("Запрос выполнен успешно.");
               }
               else
               {
                   Console.WriteLine($"Ошибка: {response.StatusCode}");
               }
           }
       }
   }
Ставь 👍 и забирай 📚 Базу знаний