C# | Вопросы собесов
Ir al canal en Telegram
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+nebTPWgpeGs1OWFi Задачи t.me/+Xy-0H7xKlgo0NDVi Вакансии t.me/+BQFHXZQ0zrViNGIy
Mostrar más5 059
Suscriptores
-324 horas
-57 días
-1230 días
Archivo de publicaciones
5 058
🤔 Как реализовать singleton?
Singleton — это шаблон проектирования, который гарантирует существование одного экземпляра класса с глобальной точкой доступа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 Что такое Dispose?
Dispose метод является частью паттерна управления ресурсами, известного как "Dispose Pattern". Этот метод реализуется в классах через интерфейс
IDisposable. Цель — явное освобождение неуправляемых ресурсов и, по желанию, управляемых ресурсов, прежде чем сборщик мусора освободит объект. Это важно для эффективного управления памятью и другими системными ресурсами.
🚩Неуправляемые и управляемые ресурсы
🟠Неуправляемые ресурсы
включают в себя ресурсы, которые не управляются средой CLR (Common Language Runtime), например, файловые дескрипторы, сетевые соединения или указатели на память, выделенную вне .NET среды.
🟠Управляемые ресурсы
это объекты .NET, которые занимают память и потенциально удерживают ссылки на неуправляемые ресурсы.
🚩Как он работает
Должен освобождать все неуправляемые ресурсы, занимаемые объектом, а также должен иметь возможность освобождать управляемые ресурсы, если это необходимо. Как правило, управляемые ресурсы освобождаются сами сборщиком мусора, но если управляемый ресурс включает в себя неуправляемые ресурсы, тогда Dispose может быть вызван для их явного освобождения.
public class ResourceHolder : IDisposable
{
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Освобождение управляемых ресурсов
}
// Освобождение неуправляемых ресурсов
disposed = true;
}
}
~ResourceHolder()
{
Dispose(false);
}
}
Пример использования Dispose
using (var resource = new ResourceHolder())
{
// Использование ресурса
}
// Метод Dispose автоматически вызывается при выходе из блока using
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 Какой самый оптимальный тип данных для подсчёта денег?
Лучше использовать decimal (в .NET) — он:
- обеспечивает высокую точность;
- не подвержен ошибкам округления, как float или double;
- специально разработан для финансовых расчётов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 Можно ли передать значимый тип данных по ссылке?
Да, можно!
По умолчанию значимые типы (структуры,
int, double) передаются по значению.
Но их можно передать по ссылке с помощью ref или out.
🚩Передача по значению (обычное поведение)
Копия передаётся в метод, а оригинал не меняется.
void ChangeValue(int number)
{
number = 10; // Изменится только копия
}
int x = 5;
ChangeValue(x);
Console.WriteLine(x); // 5 (значение не изменилось)
🚩Передача значимого типа по ссылке (`ref`)
Позволяет менять оригинальную переменную.
void ChangeValue(ref int number)
{
number = 10; // Меняем оригинальное значение
}
int x = 5;
ChangeValue(ref x);
Console.WriteLine(x); // 10 (значение изменилось)
🚩Использование `out` (без начального значения)
out тоже передаёт по ссылке, но требует обязательного присвоения внутри метода.
void InitializeValue(out int number)
{
number = 100; // Обязательно присваиваем значение
}
int x;
InitializeValue(out x);
Console.WriteLine(x); // 100
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 Почему используют dictionary, если ещё есть list?
Dictionary<TKey, TValue> и List<T> решают разные задачи:
- List<T> — это упорядоченная коллекция, доступ к элементам по индексу, перебор.
- Dictionary<TKey, TValue> — это отображение "ключ → значение", обеспечивает быстрый доступ к данным по ключу (в среднем за O(1)).
Используют Dictionary, когда:
- Нужно быстро находить элементы по уникальному ключу.
- Нет необходимости в порядковом доступе.
- Нужно хранить логически связанные пары ключ-значение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 Может ли абстрактный метод быть вне абстрактного класса?
Нет, абстрактный метод не может существовать вне абстрактного класса. В C# это ограничение встроено в язык, чтобы поддерживать строгую логику наследования и полиморфизма.
🚩Почему абстрактный метод требует абстрактного класса?
Абстрактный метод — это метод, который объявлен, но не имеет реализации. Он выступает как "контракт", который обязан быть реализован в производном классе.
public abstract class Shape
{
public abstract double CalculateArea();
}
Абстрактные методы имеют следующие особенности:
Они не могут содержать тело (реализацию).
Их цель — заставить производные классы реализовать конкретную функциональность.
Они всегда принадлежат абстрактным классам.
🚩Пример ошибки
Если попытаться объявить абстрактный метод в обычном классе, компилятор выдаст ошибку
public class RegularClass
{
public abstract void SomeMethod(); // Ошибка: абстрактный метод может быть только в абстрактном классе
}
🚩Логика дизайна
C# требует, чтобы абстрактные методы находились только в абстрактных классах, потому что:
Абстрактные классы могут содержать как абстрактные, так и обычные методы. Это позволяет определять базовое поведение в абстрактном классе и оставлять специфическую реализацию производным классам.
Обычные классы не могут содержать абстрактные методы, так как они предназначены для создания объектов, а объект не может содержать "незавершённый" метод.
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 Какие есть модификаторы доступа?
В .NET (и аналогично в Java) есть следующие модификаторы доступа:
- public — доступен везде.
- private — доступен только внутри текущего класса.
- protected — доступен внутри текущего класса и его наследников.
- internal — доступен в пределах одной сборки (проекта).
- protected internal — доступен в пределах сборки и для наследников.
- private protected — доступен только для наследников внутри той же сборки.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
Repost from easyoffer
База 1000+ реальных собеседований теперь встроена в easyoffer
Смотрите, как другие кандидаты отвечают на вопросы, решают задачи и проходят этапы на реальных собеседованиях от топовых компаний. Подготовьтесь к своему собеседованию с двойной уверенностью.
Напоминаем, что сегодня последний день Чёрной Пятницы
👉 Забрать PRO со скидкой 70%: https://easyoffer.ru/
5 058
🤔 Интерполяция - это возможность использовать в строке переменные?
Да, интерполяция строк — это удобный способ вставки значений переменных в строку без использования конкатенации (
+) или String.Format().
Простой пример интерполяции строк
string name = "Иван";
int age = 25;
string message = $"Привет, меня зовут {name}, и мне {age} лет.";
Console.WriteLine(message);
Вывод
Привет, меня зовут Иван, и мне 25 лет.🚩Дополнительные возможности интерполяции 🟠Форматирование значений Можно форматировать числа и даты прямо в строке:
double price = 99.99;
DateTime today = DateTime.Now;
string formatted = $"Цена: {price:C}, Дата: {today:dd.MM.yyyy}";
Console.WriteLine(formatted);
Вывод
Цена: 99,99 ₽, Дата: 01.03.2025🟠Выполнение выражений Можно вставлять даже арифметические операции и вызовы методов:
int a = 10, b = 5;
string mathResult = $"Сумма: {a + b}, Разница: {a - b}";
Console.WriteLine(mathResult);
Вывод
Сумма: 15, Разница: 5🟠Экранирование фигурных скобок Если нужно вывести
{} в тексте, их надо удваивать:
Console.WriteLine($"JSON: {{ \"name\": \"Иван\" }}");
Вывод
JSON: { "name": "Иван" }
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 Что такое reference-type?
Это ссылочный тип. Хранится в куче. Переменная содержит ссылку на объект, а не сам объект. Примеры:
- class, string, object, array.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 Что такое сборщик мусора?
Сборщик мусора (Garbage Collector, GC) — это форма автоматического управления памятью. Он отслеживает каждый объект, выделенный в куче, и определяет, какие объекты более не доступны для приложения, а затем освобождает память, занимаемую этими объектами. Это ключевой компонент во многих современных языках программирования и средах выполнения, облегчая задачу управления памятью.
🚩Основные этапы работы
🟠Маркировка (Marking)
Сборщик мусора периодически проходит через все объекты в куче, начиная с "корней" (объектов, непосредственно доступных в программе, например, через переменные в стеке вызовов и глобальные переменные). Он отмечает все объекты, до которых можно добраться напрямую или косвенно.
🟠Очистка (Sweeping)
После маркировки доступных объектов, сборщик мусора удаляет все непомеченные объекты, освобождая ресурсы, которые они занимали.
🟠Компактификация (Compacting)
Некоторые сборщики мусора перемещают оставшиеся объекты, чтобы уменьшить фрагментацию памяти и улучшить производительность работы с памятью.
🚩Ограничения
🟠Производительность
Процесс сборки мусора может быть ресурсоёмким и может привести к заметным паузам в выполнении программы, особенно если куча большая.
🟠Непредсказуемость
Точное время сборки мусора может быть непредсказуемым, что может создавать проблемы в приложениях с реальным временем.
Ставь 👍 и забирай 📚 Базу знаний
5 058
🤔 Что такое зацепление в коде?
Зацепление (coupling) — это мера зависимости одного модуля от другого.
- Сильное зацепление (tight coupling) — классы жёстко связаны, изменение одного требует изменения другого.
- Слабое зацепление (loose coupling) — классы слабо связаны через абстракции (например, интерфейсы), что повышает гибкость, масштабируемость и тестируемость.
Цель хорошего дизайна — добиться слабого зацепления и высокой связности внутри модуля.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
Repost from easyoffer
Черная пятница на easyoffer
Скидка 70% на PRO до 29 ноября.
👉 https://easyoffer.ru/
5 058
🤔 Про абстрактные классы, интерфейсы и в чем их разница и особенности?
В 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
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 В чём разница между var и dynamic?
- var — тип определяется на этапе компиляции. После компиляции он получает конкретный тип. Статическая типизация.
- dynamic — тип определяется во время выполнения. Ошибки типа могут проявиться только в рантайме.
var безопаснее, dynamic гибче, но требует осторожности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 Есть ли разница в какой последовательности писать 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("Произошла ошибка!");
}
Ставь 👍 и забирай 📚 Базу знаний5 058
🤔 Какие проблемы могут быть при многопоточности и как их избежать?
Проблемы: состояния гонки, deadlock, livelock, взаимные блокировки и неправильная синхронизация данных. Их избегают с помощью использования примитивов синхронизации (например, lock, Monitor, Mutex), разделения ответственности между потоками, атомарных операций и минимизации общего доступа к ресурсам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 058
🤔 В чем отличие 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;
}
}
}
Ставь 👍 и забирай 📚 Базу знаний5 058
Дизайн в FIGMA с нуля. Бесплатный курс + портфолио
Онлайн-программа с наставником и чатом. Дизайн от профессионалов. Доступ 0 руб.
Узнать больше
#реклама 16+
yudaevschool24.online
О рекламодателе
5 058
🤔 Всегда ли значимые типы находятся в стеке?
Нет, значимые типы (структуры) обычно хранятся в стеке, но если они являются частью объекта ссылочного типа, то хранятся в куче. Это зависит от контекста их использования.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
