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

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

Kanalga Telegram’da o‘tish
5 063
Obunachilar
-324 soatlar
-57 kunlar
-1230 kunlar
Postlar arxiv
🤔 Что из себя представляет абстракция? Это процесс выделения важных характеристик объекта и скрытия несущественных деталей. Она позволяет: 1. Создавать простые интерфейсы для сложных систем. 2. Сосредотачиваться на логике, а не на деталях реализации. 3. Обеспечивать полиморфизм и унифицированный подход к различным объектам. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Возможно ли как-нибудь ограничить типы, которые пользователь будет передавать через шаблон? Можно ограничить типы, которые передаются в шаблоны (generics), с помощью ключевого слова where. Это позволяет указать, какие типы подходят для использования, обеспечивая безопасность и предсказуемость кода. Вот основные виды ограничений: 🟠Класс или структура where T : class — только классы. where T : struct — только структуры. 🟠Интерфейс Указание интерфейса, который должен реализовать тип:
   public class MyClass<T> where T : IDisposable { }
   
🟠Базовый класс Указание, что тип должен быть наследником определённого класса:
   public class MyClass<T> where T : Exception { }
   
🟠Конструктор Ограничение на наличие конструктора без параметров:
   public class MyClass<T> where T : new() { }
   
🟠Комбинированные ограничения Можно объединять несколько условий:
   public class MyClass<T> where T : class, IDisposable, new() { }
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие типы данных можно использовать у Dictionary в качестве ключа? Ключи должны быть: - Уникальными - Иметь устойчивую реализацию GetHashCode() и Equals() Подходящие типы: - Примитивы (int, string, GUID и т.п.) - Структуры (например, кастомные value types) - Объекты (если правильно переопределены Equals и GetHashCode) Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие проблемы могут быть при многопоточности и как их избежать? Многопоточное программирование позволяет улучшить производительность программ за счет параллельной обработки данных, но это также влечет за собой ряд специфических проблем. Понимание этих проблем и способы их предотвращения или управления ими критически важны для создания надежных и эффективных многопоточных приложений. 🚩Основные проблемы 🟠Гонки данных (Race Conditions) Проблема: Два или более потоков пытаются одновременно изменить общие данные или один поток читает данные во время их изменения другим потоком, что приводит к непредсказуемым результатам. Решение: Использование механизмов синхронизации, таких как блокировки (locks), мьютексы (mutexes) и семафоры (semaphores), для контроля доступа к общим ресурсам. 🟠Взаимная блокировка (Deadlock) Проблема: Два или более потоков бесконечно ожидают ресурсы, заблокированные друг другом, в результате чего они не могут продолжить выполнение. Решение: Разработка программы таким образом, чтобы потоки запрашивали ресурсы всегда в одном и том же порядке, использование таймаутов для блокировок, чтобы потоки могли выйти из состояния ожидания. 🟠Голодание (Starvation) Проблема: Один или несколько потоков не могут получить доступ к необходимым ресурсам, потому что другие потоки постоянно занимают их. Решение: Применение справедливых блокировок (fair locks) или алгоритмов планирования, которые обеспечивают всем потокам равный доступ к ресурсам. 🟠Переключение контекста (Context Switching) Проблема: Частое переключение контекста между потоками может значительно снизить производительность системы, особенно если потоки часто блокируются и разблокируются. Решение: Оптимизация количества потоков, уменьшение зависимостей между потоками и уменьшение использования блокировок. 🟠Проблемы с проектированием Проблема: Неправильное проектирование многопоточной архитектуры может привести к сложностям в поддержке и расширении программного обеспечения. Решение: Использование абстракций высокого уровня для работы с потоками, таких как пулы потоков, параллельные библиотеки (например, TPL в .NET) и модели акторов.
private static readonly object _lock = new object();
private static int _sharedResource;

public static void UpdateResource()
{
    lock (_lock)
    {
        _sharedResource++;
        // Выполнение некоторой работы с общим ресурсом
    }
}
Избегание взаимной блокировки
private static readonly object _lock1

 = new object();
private static readonly object _lock2 = new object();

public static void Method1()
{
    lock (_lock1)
    {
        // Некоторые действия
        lock (_lock2)
        {
            // Дополнительные действия
        }
    }
}

public static void Method2()
{
    lock (_lock1)
    {
        // Аналогичные действия
        lock (_lock2)
        {
            // Дополнительные действия
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое абстракция? Абстракция — это принцип ООП, который выделяет только важные характеристики объекта, скрывая сложные детали его реализации. Это помогает упростить взаимодействие с объектами и сконцентрироваться на их использовании, а не на внутренней структуре. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое 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}");
               }
           }
       }
   }
Ставь 👍 и забирай 📚 Базу знаний

Как самостоятельно читать анализы и выявлять заболевания Научитесь разбирать общий анализ крови с развернутой лейкоцитарной ф
Как самостоятельно читать анализы и выявлять заболевания Научитесь разбирать общий анализ крови с развернутой лейкоцитарной формулой. Это бесплатно. На открытом уроке вы: ✅научитесь разбирать общий анализ крови с развернутой лейкоцитарной формулой; ✅узнаете о каких дефицитах может рассказать этот недорогой анализ; ✅научитесь составлять план работы с этим анализом без лекарств; ✅ узнаете, как стать нутрициологом, где искать клиентов и как зарабатывать от 100 000 рублей, не выходя из дома При регистрации вы получите подарок - конспект урока. После урока по этому конспекту вы сможете самостоятельно разобрать свой общий анализ крови. Чтобы зарегистрироваться на урок - переходите по ссылке. ⚡Урок бесплатный, поэтому количество мест ограничено. Зарегистрироваться #реклама 16+ pro-telo1.com О рекламодателе

🤔 Какие типы связей известны у join`ов? - Inner Join: Объединяет только те строки, которые совпадают в обеих таблицах. - Left Join: Возвращает все строки из левой таблицы и соответствующие строки из правой. - Right Join: Аналогично Left Join, но для правой таблицы. - Full Join: Возвращает все строки из обеих таблиц. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между FirstOfDefault и SingleOfDefault? Методы FirstOrDefault и SingleOrDefault в LINQ используются для извлечения элементов из коллекции, но их логика работы отличается. Давайте разберем их подробно, с примерами. 🚩FirstOrDefault FirstOrDefault возвращает первый элемент коллекции, который удовлетворяет условию (если условие указано), или первый элемент вообще, если условие отсутствует. Если в коллекции нет элементов, метод возвращает значение по умолчанию для типа (например, null для ссылочных типов или 0 для чисел). Когда вас интересует первый элемент коллекции, но коллекция может быть пустой. Когда вам неважно, есть ли другие элементы, соответствующие условию.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем первый элемент, который больше 3
int result = numbers.FirstOrDefault(n => n > 3); // result = 4

// Если условие не выполняется
int result2 = numbers.FirstOrDefault(n => n > 10); // result2 = 0 (default для int)

// Если коллекция пустая
List<int> emptyList = new List<int>();
int result3 = emptyList.FirstOrDefault(); // result3 = 0
🚩SingleOrDefault SingleOrDefault возвращает единственный элемент из коллекции, который удовлетворяет условию. Если такого элемента нет, метод возвращает значение по умолчанию. Однако если в коллекции есть более одного элемента, удовлетворяющего условию, будет выброшено исключение (InvalidOperationException). Когда вы ожидаете, что в коллекции будет ровно один элемент, соответствующий условию. Когда наличие нескольких подходящих элементов является ошибкой и вы хотите это обработать.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем единственный элемент, равный 3
int result = numbers.SingleOrDefault(n => n == 3); // result = 3

// Если элемента, соответствующего условию, нет
int result2 = numbers.SingleOrDefault(n => n > 10); // result2 = 0

// Если элементов больше одного, возникает исключение
List<int> duplicateNumbers = new List<int> { 1, 2, 3, 3, 4 };
try
{
    int result3 = duplicateNumbers.SingleOrDefault(n => n > 2);
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message); // Ошибка: последовательность содержит несколько элементов
}
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Зачем сделали ref & out для ссылочных типов? В C# ключевые слова ref и out используются для передачи аргументов по ссылке, что позволяет методам изменять значения этих аргументов. Эти механизмы полезны как для значимых типов (структур), так и для ссылочных типов (объектов). Давайте рассмотрим более детально, зачем и как их используют для ссылочных типов. 🚩`ref` С помощью ref можно передавать ссылочные типы таким образом, чтобы метод мог изменять саму ссылку, то есть ссылаться на другой объект. 🚩`out` Ключевое слово out позволяет передавать аргумент, который не обязательно должен быть инициализирован до вызова метода. Метод, принимающий out аргумент, обязан присвоить ему значение до завершения работы. 🚩Как используются `ref` и `out`? Пример использования ref
class Program
{
    static void ChangeReference(ref MyClass obj)
    {
        obj = new MyClass { Value = 20 };
    }

    static void Main()
    {
        MyClass myObj = new MyClass { Value = 10 };
        ChangeReference(ref myObj);
        Console.WriteLine(myObj.Value); // Output: 20
    }
}

class MyClass
{
    public int Value { get; set; }
}
Пример использования out
class Program
{
    static void InitializeObject(out MyClass obj)
    {
        obj = new MyClass { Value = 30 };
    }

    static void Main()
    {
        MyClass myObj;
        InitializeObject(out myObj);
        Console.WriteLine(myObj.Value); // Output: 30
    }
}

class MyClass
{
    public int Value { get; set; }
}
🚩Почему это нужно? 🟠Гибкость ref и out добавляют гибкости при работе с методами, позволяя им изменять ссылки на объекты или создавать и возвращать новые объекты. 🟠Оптимизация Эти механизмы могут быть полезны для оптимизации, когда необходимо избежать лишнего копирования данных, особенно при работе с большими объектами. 🟠Логика инициализации out полезен для методов, которые должны вернуть несколько значений или инициализировать объекты, которые не могут быть инициализированы заранее. Ставь 👍 и забирай 📚 Базу знаний

🤔 Интерполяция — это возможность использовать в строке переменные? Да, строковая интерполяция — это способ вставить значение переменной прямо внутрь строки. Это улучшает читаемость, заменяя конкатенацию. Используется как способ встроенного форматирования текста. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как сейчас делается Singleton? В современном C# паттерн Singleton можно реализовать несколькими способами, каждый из которых имеет свои преимущества и предназначен для различных сценариев использования. Рассмотрим несколько распространенных подходов к реализации Singleton. 🟠Ленивый Singleton (Lazy Initialization) Ленивый Singleton инициализируется при первом обращении. Это обеспечивает отложенную инициализацию объекта и гарантирует потокобезопасность.
public class Singleton
{
    private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance => lazyInstance.Value;

    private Singleton()
    {
        // Приватный конструктор
    }
}
🟠Потокобезопасный Singleton (Thread-safe) Этот подход использует lock для обеспечения потокобезопасности при создании экземпляра.
public class Singleton
{
    private static Singleton instance;
    private static readonly object lockObj = new object();

    private Singleton()
    {
        // Приватный конструктор
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObj)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}
Eager Initialization (Инициализация при загрузке) Экземпляр Singleton создается при загрузке класса. Это гарантирует потокобезопасность за счет особенностей инициализации статических переменных в .NET.
public class Singleton
{
    private static readonly Singleton instance = new Singleton();

    public static Singleton Instance => instance;

    private Singleton()
    {
        // Приватный конструктор
    }
}
🟠Static Constructor (Статический конструктор) Использование статического конструктора для инициализации Singleton.
public class Singleton
{
    private static readonly Singleton instance;

    static Singleton()
    {
        instance = new Singleton();
    }

    public static Singleton Instance => instance;

    private Singleton()
    {
        // Приватный конструктор
    }
}
Singleton с внедрением зависимостей (Dependency Injection) В современных приложениях, особенно с использованием ASP.NET Core, Singleton часто регистрируется в контейнере внедрения зависимостей.
public class SingletonService
{
    public void DoWork()
    {
        // Выполнение работы
    }
}

// Регистрация в контейнере служб
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<SingletonService>();
}

// Использование в контроллере
public class MyController : ControllerBase
{
    private readonly SingletonService _singletonService;

    public MyController(SingletonService singletonService)
    {
        _singletonService = singletonService;
    }

    public IActionResult Index()
    {
        _singletonService.DoWork();
        return Ok();
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница Redis и Memcached? Redis — это больше, чем просто кэш: он поддерживает множество структур данных (строки, списки, множества, хэши). Memcached предназначен исключительно для кэширования строк и объектов, проще в использовании. Redis также обеспечивает персистентность данных, чего нет в Memcached. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как в кучах разделяются объекты? В .NET среде управления памятью, объекты размещаются в куче (heap), и управление памятью осуществляется сборщиком мусора (Garbage Collector, GC). Куча разделена на несколько поколений для оптимизации производительности управления памятью. 🚩Поколения кучи Куча в .NET разделена на три поколения: Generation 0, Generation 1 и Generation 2. Это разделение позволяет эффективно управлять памятью, минимизируя частоту сборок мусора и оптимизируя их выполнение. 🟠Generation 0 Содержит новосозданные объекты. Сборка мусора для этого поколения происходит чаще, так как большинство объектов "умирает" быстро. Наименьший размер среди всех поколений. 🟠Generation 1 Промежуточное поколение, используемое для объектов, которые пережили хотя бы одну сборку мусора Generation 0. Содержит объекты с более длительным временем жизни, чем объекты в Generation 0. 🟠Generation 2 Содержит объекты с самым длительным временем жизни. Наибольший размер среди всех поколений. Сборка мусора для этого поколения происходит реже всего. 🚩Large Object Heap (LOH) LOH используется для размещения крупных объектов (размером 85,000 байт и более). Объекты в LOH не перемещаются при сборке мусора, что уменьшает фрагментацию памяти. Сборка мусора для LOH происходит одновременно со сборкой Generation 2. 🚩Как разделяются объекты 🟠Размещение объектов При создании объекта он сначала размещается в Generation 0. Если объект переживает сборку мусора в Generation 0, он перемещается в Generation 1. Если объект переживает сборку мусора в Generation 1, он перемещается в Generation 2. 🟠Сборка мусора Generation 0: Быстрая и частая сборка. Цель - освободить память от краткоживущих объектов. Generation 1: Реже, чем Generation 0. Служит промежуточной зоной. Generation 2: Самая редкая и длительная сборка. Обрабатывает долгоживущие объекты. Large Object Heap (LOH): Сборка мусора проводится вместе с Generation 2.
public class Program
{
    public static void Main()
    {
        // Создание объектов в Generation 0
        for (int i = 0; i < 1000; i++)
        {
            var obj = new object();
        }

        // Создание большого объекта (размещается в LOH)
        byte[] largeArray = new byte[100000];
        
        // Принудительный вызов сборщика мусора
        GC.Collect();

        // Проверка поколения объекта
        Console.WriteLine(GC.GetGeneration(largeArray)); // Скорее всего, 2
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие есть виды приведения типов? 1. Явное (explicit) — требует указания типа вручную. Может привести к ошибке времени выполнения. 2. Неявное (implicit) — происходит автоматически, когда не теряется информация. 3. Пользовательское (custom) — через оператор operator или as/is. 4. Boxing/Unboxing — упаковка значимых типов в объект и обратно. 5. Приведение интерфейсов/наследования — преобразование к базовому или интерфейсному типу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Если мы используем Ref & out, то становится ли эта структура ссылочным типом? Нет, структура (struct) не становится ссылочным типом, даже если мы передаём её через ref или out. Однако, когда структура передаётся с ref или out, передаётся сама структура (по ссылке), а не её копия. Это позволяет изменять исходный объект напрямую, избегая копирования. 🚩Разница между обычной передачей и передачей через `ref` Передача структуры без ref (по значению, копируется)
struct Point
{
    public int X;
    public int Y;
}

void ChangePoint(Point p)
{
    p.X = 100;
}

Point myPoint = new Point { X = 10, Y = 20 };
ChangePoint(myPoint);

Console.WriteLine(myPoint.X); // 10 (НЕ изменилось, потому что была копия)
Передача структуры с ref (по ссылке, изменения сохраняются)
void ChangePointRef(ref Point p)
{
    p.X = 100;
}

ChangePointRef(ref myPoint);

Console.WriteLine(myPoint.X); // 100 (значение изменилось)
🚩Что насчёт `out`? out работает так же, как ref, но требует обязательной инициализации внутри метода.
void InitPoint(out Point p)
{
    p = new Point { X = 50, Y = 50 }; // Обязательно присвоить значение
}

Point newPoint;
InitPoint(out newPoint);

Console.WriteLine(newPoint.X); // 50
Ставь 👍 и забирай 📚 Базу знаний

🤔 Возможно ли как-нибудь ограничить типы, которые пользователь будет передавать через шаблон? Да, можно. В C# для ограничения (ограничений) обобщённых типов используется ключевое слово where. Примеры ограничений: - where T : class — только ссылочные типы. - where T : struct — только значимые типы. - where T : new() — должен иметь публичный конструктор без параметров. - where T : BaseClass — должен быть наследником BaseClass. - where T : interfaceName — должен реализовывать указанный интерфейс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Стажировки и вакансии для .NET разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegr
Стажировки и вакансии для .NET разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_dot_net 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Пример выполнения кода, когда возвращается объект интерфейса Iqueryable? IQueryable<T> — это интерфейс, который используется для отложенного выполнения запросов (deferred execution). Он позволяет строить SQL-запросы к базе данных или манипулировать данными в памяти, но сам запрос выполняется только в момент его итерации (ToList(), FirstOrDefault(), Count(), и т. д.). 🚩Пример работы с `IQueryable<T>` на Entity Framework Core Предположим, у нас есть сущность Product и контекст базы данных AppDbContext
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("YourConnectionString");
    }
}
Теперь создадим репозиторий, который возвращает IQueryable<Product>
public class ProductRepository
{
    private readonly AppDbContext _context;

    public ProductRepository(AppDbContext context)
    {
        _context = context;
    }

    public IQueryable<Product> GetProducts()
    {
        return _context.Products.Where(p => p.Price > 100); 
        // Запрос не выполняется здесь! Только формируется
    }
}
🚩Вызов метода и выполнение запроса Запрос к базе данных выполнится только при материализации (ToList(), FirstOrDefault(), Count(), и т. д.).
var repository = new ProductRepository(new AppDbContext());

// Создаём IQueryable-запрос
IQueryable<Product> query = repository.GetProducts();

// Добавляем дополнительное условие (запрос еще НЕ выполнен)
query = query.OrderBy(p => p.Name);

// Теперь выполняем запрос к БД
List<Product> products = query.ToList(); // SQL-запрос отправляется в базу
Ставь 👍 и забирай 📚 Базу знаний