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 015
Subscribers
+224 hours
+37 days
+2330 days
Posts Archive
🤔 Что такое сборщик мусора? Сборщик мусора (Garbage Collector, GC) — это форма автоматического управления памятью. Он отслеживает каждый объект, выделенный в куче, и определяет, какие объекты более не доступны для приложения, а затем освобождает память, занимаемую этими объектами. Это ключевой компонент во многих современных языках программирования и средах выполнения, облегчая задачу управления памятью. 🚩Основные этапы работы 🟠Маркировка (Marking) Сборщик мусора периодически проходит через все объекты в куче, начиная с "корней" (объектов, непосредственно доступных в программе, например, через переменные в стеке вызовов и глобальные переменные). Он отмечает все объекты, до которых можно добраться напрямую или косвенно. 🟠Очистка (Sweeping) После маркировки доступных объектов, сборщик мусора удаляет все непомеченные объекты, освобождая ресурсы, которые они занимали. 🟠Компактификация (Compacting) Некоторые сборщики мусора перемещают оставшиеся объекты, чтобы уменьшить фрагментацию памяти и улучшить производительность работы с памятью. 🚩Ограничения 🟠Производительность Процесс сборки мусора может быть ресурсоёмким и может привести к заметным паузам в выполнении программы, особенно если куча большая. 🟠Непредсказуемость Точное время сборки мусора может быть непредсказуемым, что может создавать проблемы в приложениях с реальным временем. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое зацепление в коде? Зацепление (coupling) — это мера зависимости одного модуля от другого. - Сильное зацепление (tight coupling) — классы жёстко связаны, изменение одного требует изменения другого. - Слабое зацепление (loose coupling) — классы слабо связаны через абстракции (например, интерфейсы), что повышает гибкость, масштабируемость и тестируемость. Цель хорошего дизайна — добиться слабого зацепления и высокой связности внутри модуля. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Repost from easyoffer
Черная пятница на easyoffer Скидка 70% на PRO до 29 ноября. 👉 https://easyoffer.ru/
Черная пятница на easyoffer Скидка 70% на PRO до 29 ноября. 👉 https://easyoffer.ru/

🤔 Про абстрактные классы, интерфейсы и в чем их разница и особенности? В C# абстрактные классы и интерфейсы используются для проектирования системы через наследование и полиморфизм, позволяя описывать общую функциональность, которую будут реализовывать конкретные классы. Однако у них есть свои особенности, ограничения и сферы применения. 🚩Абстрактный класс Абстрактный класс — это класс, который не может быть создан напрямую (нельзя создать объект этого класса). Он может содержать как абстрактные методы (без реализации), так и методы с реализацией.
public abstract class Animal
{
    public abstract void MakeSound(); // Абстрактный метод
    public void Sleep() // Метод с реализацией
    {
        Console.WriteLine("Sleeping...");
    }
}
Пример
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}
Использование
Animal myDog = new Dog();
myDog.MakeSound(); // Вывод: Bark!
myDog.Sleep();     // Вывод: Sleeping...
🚩Интерфейс Интерфейс — это контракт, который определяет только сигнатуры методов, свойств, событий и индексаторов. Реализацию этих членов должен предоставить класс, который реализует интерфейс.
public interface IMovable
{
    void Move();
    int Speed { get; set; }
}
Пример
public class Car : IMovable
{
    public int Speed { get; set; }

    public void Move()
    {
        Console.WriteLine($"Moving at speed: {Speed}");
    }
}
Использование
IMovable myCar = new Car { Speed = 60 };
myCar.Move(); // Вывод: Moving at speed: 60
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём разница между var и dynamic? - var — тип определяется на этапе компиляции. После компиляции он получает конкретный тип. Статическая типизация. - dynamic — тип определяется во время выполнения. Ошибки типа могут проявиться только в рантайме. var безопаснее, dynamic гибче, но требует осторожности. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Есть ли разница в какой последовательности писать 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("Произошла ошибка!");
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие проблемы могут быть при многопоточности и как их избежать? Проблемы: состояния гонки, deadlock, livelock, взаимные блокировки и неправильная синхронизация данных. Их избегают с помощью использования примитивов синхронизации (например, lock, Monitor, Mutex), разделения ответственности между потоками, атомарных операций и минимизации общего доступа к ресурсам. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем отличие dispose и finalize? Dispose и Finalize являются двумя механизмами для управления ресурсами, особенно теми, которые не управляются средой выполнения .NET, такими как файловые дескрипторы или соединения с базой данных. Они играют важную роль в освобождении ресурсов, но работают по-разному. 🚩Finalize Можно переопределить в классе для выполнения очистки ресурсов перед тем, как объект будет собран сборщиком мусора. Этот метод вызывается сборщиком мусора автоматически, если объект уничтожается и не имеет других живых ссылок. 🚩Dispose Является частью интерфейса IDisposable и предоставляет явный способ освобождения управляемых и неуправляемых ресурсов. Разработчики могут вызывать Dispose вручную или использовать конструкцию using, которая гарантирует вызов Dispose по завершении блока кода.
public class ResourceHolder : IDisposable
{
    private bool disposed = false;

    ~ResourceHolder() // Финализатор
    {
        Dispose(false);
    }

    public void Dispose() // Метод Dispose из IDisposable
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Освобождение управляемых ресурсов
            }

            // Освобождение неуправляемых ресурсов
            disposed = true;
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

Дизайн в FIGMA с нуля. Бесплатный курс + портфолио Онлайн-программа с наставником и чатом. Дизайн от профессионалов. Доступ 0 руб. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе

🤔 Всегда ли значимые типы находятся в стеке? Нет, значимые типы (структуры) обычно хранятся в стеке, но если они являются частью объекта ссылочного типа, то хранятся в куче. Это зависит от контекста их использования. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны? Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения. 🟠Примитивные типы (Value Types) Для примитивных типов (например, int, float, char, bool) значение хранятся непосредственно в переменных, и их сравнение выполняется по значению.
int a = 5;
int b = 5;

bool areEqual = (a == b); // True
🟠Ссылочные типы (Reference Types) Для ссылочных типов (например, классы, строки) переменные содержат ссылки на объекты в куче. Сравнение ссылочных типов по умолчанию выполняется по ссылке, а не по значению.
class Person
{
    public string Name { get; set; }
}

Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };

bool areEqual = (person1 == person2); // False, потому что сравниваются ссылки
🟠Строки (Strings) Строки являются ссылочными типами, но переопределяют операторы сравнения == и Equals для сравнения по значению.
string str1 = "Hello";
string str2 = "Hello";

bool areEqual = (str1 == str2); // True, строки сравниваются по значению
🟠Кастомные классы Для кастомных классов можно переопределить методы Equals и GetHashCode, чтобы сравнивать объекты по значению.
class Person
{
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
            return false;

        Person other = (Person)obj;
        return Name == other.Name;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}

Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };

bool areEqual = person1.Equals(person2); // True
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое HashSet? HashSet — это коллекция уникальных элементов, основанная на хеш-таблице. Он: - Обеспечивает быстрые вставку и поиск. - Не допускает дубликатов. - Не гарантирует порядок. Используется, когда нужно отфильтровать повторения и обеспечить быстрый доступ. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем суть extension методов? Extension-методы (методы расширения) — это способ добавить новые методы к существующим классам, не изменяя их код и не создавая наследников. Они позволяют расширять классы и интерфейсы, даже если у нас нет доступа к их исходному коду. 🚩Как работают extension-методы? Это обычные статические методы, но объявленные внутри статического класса. Первый параметр метода должен принимать тот тип, который мы хотим расширить, и перед ним ставится ключевое слово this. После этого метод становится доступен как "встроенный" у этого типа. 🟠Добавляем метод к `string` Допустим, у нас есть строка, и мы хотим добавить метод ToSnakeCase, который заменяет пробелы на нижние подчеркивания.
using System;

public static class StringExtensions
{
    public static string ToSnakeCase(this string str)
    {
        return str.Replace(" ", "_").ToLower();
    }
}

class Program
{
    static void Main()
    {
        string text = "Hello World";
        Console.WriteLine(text.ToSnakeCase()); // hello_world
    }
}
🟠Расширяем `List<int>` Добавим метод `SumEvenNumbers()`, который суммирует только четные числа в List<int>.
using System;
using System.Collections.Generic;
using System.Linq;

public static class ListExtensions
{
    public static int SumEvenNumbers(this List<int> numbers)
    {
        return numbers.Where(n => n % 2 == 0).Sum();
    }
}

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
        Console.WriteLine(numbers.SumEvenNumbers()); // 12 (2 + 4 + 6)
    }
}
🚩Когда использовать extension-методы? Когда нужно добавить новый метод к существующему классу, но нельзя изменить его код (например, string, List<T>, DateTime). Когда хочется сделать код более читаемым: numbers.SumEvenNumbers() лучше, чем MyExtensions.SumEvenNumbers(numbers). Когда нужно улучшить API без наследования и изменения структуры классов. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие основные паттерны используются в back-end? На back-end чаще всего используются: - Repository — для доступа к данным. - Unit of Work — управление транзакциями. - Dependency Injection — разделение зависимостей и реализаций. - CQRS — разделение команд и запросов. - Mediator — упрощает взаимодействие между компонентами. - Factory / Abstract Factory — динамическое создание объектов. - Builder — создание сложных объектов шаг за шагом. - Strategy — переключение алгоритмов без изменения клиентского кода. - Adapter — интеграция сторонних библиотек и API. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое builder паттерн? Это порождающий паттерн проектирования, который используется для пошагового создания сложных объектов. Он разделяет процесс конструирования объекта от его представления, позволяя создавать различные представления объекта, следуя одному и тому же процессу конструирования. 🚩Основные цели и задачи паттерна 🟠Разделение создания и представления Отделяет процесс конструирования объекта от его представления, чтобы один и тот же процесс мог использоваться для создания различных представлений объекта. 🟠Пошаговое создание объектов Позволяет создавать объекты поэтапно, контролируя процесс конструирования и предотвращая создание объекта в неконсистентном состоянии. 🟠Поддержка неизменяемых объектов Может использоваться для создания неизменяемых объектов с большим количеством опций и параметров. 🚩Структура паттерна 🟠Builder Определяет интерфейс для пошагового конструирования объекта. 🟠ConcreteBuilder Реализует интерфейс Builder и создает конкретный продукт. 🟠Director Управляет объектом Builder и задает алгоритм создания объекта. 🟠Product Класс, представляющий создаваемый сложный объект. 🚩Пример использования паттерна Строитель 1⃣Определение продукта
public class House
{
    public string Walls { get; set; }
    public string Roof { get; set; }
    public string Foundation { get; set; }

    public override string ToString()
    {
        return $"House with {Walls}, {Roof} and {Foundation}";
    }
}
2⃣Определение интерфейса Builder
public interface IHouseBuilder
{
    void BuildFoundation();
    void BuildWalls();
    void BuildRoof();
    House GetHouse();
}
3⃣Реализация конкретного Builder
public class ConcreteHouseBuilder : IHouseBuilder
{
    private House _house = new House();

    public void BuildFoundation()
    {
        _house.Foundation = "Concrete Foundation";
    }

    public void BuildWalls()
    {
        _house.Walls = "Concrete Walls";
    }

    public void BuildRoof()
    {
        _house.Roof = "Concrete Roof";
    }

    public House GetHouse()
    {
        return _house;
    }
}
4⃣Определение Director
public class ConstructionDirector
{
    private readonly IHouseBuilder _builder;

    public ConstructionDirector(IHouseBuilder builder)
    {
        _builder = builder;
    }

    public void ConstructHouse()
    {
        _builder.BuildFoundation();
        _builder.BuildWalls();
        _builder.BuildRoof();
    }
}
5⃣Использование паттерна Строитель
public class Program
{
    public static void Main()
    {
        IHouseBuilder builder = new ConcreteHouseBuilder();
        ConstructionDirector director = new ConstructionDirector(builder);

        director.ConstructHouse();
        House house = builder.GetHouse();

        Console.WriteLine(house); // Output: House with Concrete Walls, Concrete Roof and Concrete Foundation
    }
}
🚩Плюсы ➕Контроль процесса создания Позволяет контролировать процесс создания сложных объектов поэтапно. ➕Гибкость Разделение конструирования и представления позволяет использовать один и тот же процесс для создания различных объектов. ➕Читаемость кода Код становится более читаемым и поддерживаемым, так как процесс создания объекта инкапсулирован в отдельный класс. ➕Поддержка сложных объектов Упрощает создание объектов с множеством параметров и сложной иерархией. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Каким образом запускается сборка мусора? Сборщик мусора (Garbage Collector, GC) в .NET автоматически управляет памятью, освобождая неиспользуемые объекты. 🚩Как запускается GC? 🟠Автоматически (по мере необходимости) GC сам решает, когда запуститься, исходя из: Заполнения памяти (Heap почти полный) Недостатка ресурсов (мало RAM) Давления на систему
class Program
{
    static void Main()
    {
        for (int i = 0; i < 100000; i++)
        {
            var obj = new object(); // Создаётся много объектов
        } // После выхода из цикла ненужные объекты освобождаются GC
    }
}
🟠Вручную (`GC.Collect()`) Можно форсировать сборку мусора, но это редко рекомендуется**, так как GC сам лучше решает, когда запускаться.
GC.Collect(); // Принудительный запуск сборщика мусора
GC.WaitForPendingFinalizers(); // Дождаться завершения финализаторов
🟠Через `using` и `Dispose()` (IDisposable) GC не сразу удаляет объекты с ресурсами (файлы, сокеты). Такие объекты лучше очищать вручную через Dispose() или using.
using (StreamWriter writer = new StreamWriter("file.txt"))
{
    writer.WriteLine("Привет, мир!");
} // `Dispose()` вызовется автоматически
Ставь 👍 и забирай 📚 Базу знаний

Как получить оффер, а не проходить 100500 собеседований впустую? HR Яндекса ответила на самые острые вопросы 🌶️ Почему сейча
Как получить оффер, а не проходить 100500 собеседований впустую? HR Яндекса ответила на самые острые вопросы 🌶️ Почему сейчас так сложно найти работу (и что с этим делать) Секретная фишка перед оффером: как УЗНАТЬ всё и УСИЛИТЬ свою позицию Что писать в резюме, чтобы тебе не занизили зарлату Сохраняй ключ к офферу мечты 👇 https://t.me/myshortnote

🤔 Для чего используется Dependency Injection? Dependency Injection используется для: 1. Уменьшения связности между компонентами. 2. Повышения тестируемости за счет легкой замены зависимостей. 3. Управления жизненным циклом объектов через внешние механизмы, такие как контейнеры DI. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между 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); // Ошибка: последовательность содержит несколько элементов
}
Ставь 👍 и забирай 📚 Базу знаний