en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

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

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

Open in Telegram

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

Show more
5 013
Subscribers
-224 hours
-17 days
+2130 days
Posts Archive
🤔 Есть ли разница в какой последовательности писать 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}");
               }
           }
       }
   }
Ставь 👍 и забирай 📚 Базу знаний

В турагентство на удаленку требуются стажеры Клиентов предоставим. Можно без опыта и совмещая с основной работой или декретом
В турагентство на удаленку требуются стажеры Клиентов предоставим. Можно без опыта и совмещая с основной работой или декретом. С нас обучение с гарантированной стажировкой. Доход после обучения: от 50 000₽ до 220 000₽. Оплата в процессе обучения зависит от вашей вовлеченности. Задачи: Помогать людям организовывать путешествия: подбор самых выгодных предложений на отдых со скидкой до 50% в новых сервисах бронирования. Условия: ✅ Без опыта — обучение с нуля за 2 месяца, первые выплаты в среднем в течение 2 недель; ✅Удаленная работа или совмещение с офисом (по желанию, зависит от вашего города). Хотите проверить, подойдет ли это вам? Регистрируйтесь на бесплатный вводный урок, на котором узнаете: — как подбирать туры для себя и близких с выгодой до 40% — как получать комиссию 7-10% с каждого тура. Узнать больше #реклама 16+ via-tourism-school.space О рекламодателе

🤔 В чём отличие Dictionary от HashSet? - Dictionary — это пара "ключ-значение", где ключи уникальны. - HashSet — множество только ключей, без значений. Dictionary нужен для сопоставления данных. HashSet — для хранения уникальных значений без привязки к данным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множ
Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множество деталей: удобную дату, вовлекающий контент, методы продвижения и взаимодействия с участниками. Вебинары от МТС Линк помогают привлекать новых клиентов и увеличивать конверсию из участника в лид. В сервисе доступен анализ поведения пользователей во время вебинара, синхронный перевод, автовебинары и интерактивные инструменты для вовлечения участников. Делимся методичкой с кейсами, чек-листами и инструкциями для маркетологов, PR и event-менеджеров, чтобы сделать вебинары эффективным инструментом для лидогенерации. Получите методичку бесплатно на сайте. Скачать #реклама 16+ mts-link.ru О рекламодателе

🤔 Какие принципы и практики используешь для обеспечения безопасности приложений? 🟠Валидация и Санитизация Входных Данных Валидация входных данных помогает предотвратить атаки, такие как SQL-инъекции, XSS (межсайтовый скриптинг) и другие. SQL-инъекции: Используйте параметризованные запросы или ORM (например, Entity Framework).
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username = @username", conn))
{
    cmd.Parameters.AddWithValue("@username", username);
    // Выполнение команды
}
XSS: Используйте библиотеку для экранирования HTML, например, AntiXSS.
string safeContent = Microsoft.Security.Application.Encoder.HtmlEncode(userInput);
🟠Использование Аутентификации и Авторизации Обеспечьте надежную аутентификацию и разграничение доступа к ресурсам. Аутентификация: Используйте современные методы аутентификации, такие как OAuth, OpenID Connect. Авторизация: Применяйте ролевую или заявочную (claims-based) авторизацию.
[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{
    return View();
}
🟠Защита от CSRF (Межсайтовая подделка запросов) Используйте анти-CSRF токены для защиты от CSRF атак.
<form asp-action="Create">
    <input type="hidden" name="__RequestVerificationToken" value="@Antiforgery.GetTokens(HttpContext).RequestToken" />
    <!-- Другие поля формы -->
</form>
🟠Шифрование и Защита Данных Шифруйте чувствительные данные как при передаче, так и при хранении. При передаче: Используйте HTTPS для шифрования данных, передаваемых через сеть. При хранении: Используйте библиотеки для шифрования, такие как System.Security.Cryptography.
using (Aes aes = Aes.Create())
{
    aes.Key = key;
    aes.IV = iv;
    // Шифрование данных
}
🟠Логирование и Мониторинг Внедрите логирование и мониторинг для обнаружения и анализа подозрительной активности. Логирование: Логируйте важные действия, такие как входы в систему, изменения данных. Мониторинг: Используйте инструменты мониторинга, такие как Application Insights, для отслеживания состояния приложения.
_logger.LogInformation("User {UserId} logged in.", userId);
🟠Управление Ошибками и Исключениями Не показывайте подробные сообщения об ошибках пользователям, чтобы не раскрывать внутреннюю структуру приложения. Обработка исключений: Ловите и корректно обрабатывайте исключения, предоставляя пользователю дружелюбные сообщения.
try
{
    // Код, который может вызвать исключение
}
catch (Exception ex)
{
    _logger.LogError(ex, "Произошла ошибка.");
    return View("Error");
}
🟠Обновления и Патчи Регулярно обновляйте используемые библиотеки и фреймворки, чтобы закрывать уязвимости. 🟠Минимизация Поверхности Атаки Удалите или отключите ненужные функции и сервисы, чтобы минимизировать возможные точки входа для атак. 🟠Защита Конфигурации Защитите конфигурационные файлы, содержащие чувствительную информацию. Секреты и ключи: Используйте секреты и безопасное хранилище для конфиденциальной информации.
var connectionString = Configuration["ConnectionStrings:DefaultConnection"];
Ставь 👍 и забирай 📚 Базу знаний