C# | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
نمایش بیشتر5 002
مشترکین
-324 ساعت
-97 روز
-730 روز
آرشیو پست ها
5 002
В чём отличие thread от task ?
Спросят с вероятностью 33%
Thread и Task оба предназначены для выполнения кода в многопоточном или асинхронном режиме, но они имеют различные подходы и используются в разных сценариях.
Thread
Это более традиционный способ работы с многопоточностью, который позволяет создавать и управлять потоками напрямую. Каждый поток
Thread занимает определённый объем системных ресурсов, включая стек памяти, и выполняется на отдельных ядрах процессора.
✅Прямое управление: Позволяет точно контролировать поведение потоков, включая приоритеты, состояния и другие низкоуровневые операции.
✅Затраты ресурсов: Каждый поток требует дополнительных системных ресурсов, что может стать проблемой при создании большого числа потоков.
✅Использование: Идеально подходит для длительных и непрерывных фоновых задач, которые требуют активного взаимодействия с операционной системой.
Task
Представляет собой более высокоуровневый и гибкий способ управления асинхронными операциями. Task может использовать пул потоков для выполнения работы, что уменьшает нагрузку на систему за счёт переиспользования уже существующих потоков.
✅Высокоуровневый абстрактный подход: Предоставляет более простую и удобную модель работы с асинхронным кодом, позволяя использовать такие функции, как await, ContinueWith и другие.
✅Ресурсоэффективность: Использование пула потоков позволяет более эффективно управлять ресурсами, особенно при выполнении большого количества коротких задач.
✅Использование: Идеально подходит для выполнения асинхронных операций, которые включают ожидание завершения внешних событий или операций, таких как ввод-вывод, загрузки файлов, запросы к базам данных и т.д.
Thread
using System;
using System.Threading;
class Program
{
static void Main()
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
thread.Join();
}
static void DoWork()
{
Console.WriteLine("Working on a thread from Thread class.");
}
}
Task
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Task task = Task.Run(() => DoWork());
await task;
}
static void DoWork()
{
Console.WriteLine("Working on a thread from Task class.");
}
}
Использование Task является предпочтительным для большинства асинхронных операций из-за его гибкости, масштабируемости и удобства в использовании. Однако Thread может быть необходим в сценариях, где требуется более тонкое управление над потоками или когда задача требует постоянного взаимодействия с потоком.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых5 002
🤔 Какой из нижеперечисленных типов данных является ссылочным в C#?
5 002
В чем отличие dispose и finalize ?
Спросят с вероятностью 22%
Dispose и Finalize являются двумя механизмами для управления ресурсами, особенно теми, которые не управляются средой выполнения .NET, такими как файловые дескрипторы или соединения с базой данных. Они играют важную роль в освобождении ресурсов, но работают по-разному.
Finalize
Можно переопределить в классе для выполнения очистки ресурсов перед тем, как объект будет собран сборщиком мусора. Этот метод вызывается сборщиком мусора автоматически, если объект уничтожается и не имеет других живых ссылок.
Недостатки:
✅Непредсказуемость: Не определено точное время, когда сборщик мусора вызовет
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;
}
}
}
В этом примере класс ResourceHolder реализует IDisposable и имеет финализатор. Если метод Dispose() вызван явно или через using, то ресурсы освобождаются немедленно, а вызов финализатора подавляется функцией GC.SuppressFinalize(this). Если Dispose() не вызван, то очистка ресурсов произойдет, когда сборщик мусора вызовет финализатор.
Dispose предназначен для явного управления освобождением ресурсов, что позволяет контролировать время их освобождения. Finalize используется для аварийной очистки, когда ресурсы не были освобождены должным образом. Использование Dispose считается более предпочтительным с точки зрения управления ресурсами и производительности программы.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых5 002
– Помощь с pet-проектом
– Составление roadmap
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством
Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.
🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию
5 002
Есть ref out и boxing unboxing в чем их разница ?
Спросят с вероятностью 33%
ref, out, и механизмы "boxing" и "unboxing" выполняют разные задачи и используются в различных сценариях программирования. Давайте рассмотрим их подробнее, чтобы понять разницу.
ref и out
Эти ключевые слова используются для передачи параметров методов по ссылке, а не по значению. Это означает, что изменения, внесенные в аргументы внутри метода, сохраняются и после выхода из метода.
✅`ref`: Используется, когда передаваемая переменная должна быть инициализирована перед передачей в метод. Метод, получающий параметр с
ref, может как читать, так и изменять значение переменной.
✅`out`: Похоже на ref, но не требует, чтобы переменная была инициализирована перед её передачей в метод. Метод, получающий параметр с out, обязан присвоить ему значение перед выходом из метода.
void Increment(ref int value) {
value += 1;
}
void GetValues(out int value1, out int value2) {
value1 = 10;
value2 = 20;
}
int number = 5;
Increment(ref number); // number теперь равно 6
int first, second;
GetValues(out first, out second); // first равно 10, second равно 20
Boxing и Unboxing
Это процессы, связанные с преобразованием типов значений в типы ссылок и обратно. Это важно для управления памятью и взаимодействия между разными типами данных в .NET.
✅Boxing: Процесс преобразования типа значения в тип объекта или в любой другой тип интерфейса, который этот тип значения реализует. Это упаковывает структуру внутри нового объекта на куче.
✅Unboxing: Обратный процесс, когда объект типа, содержащего упакованное значение типа значения, преобразуется обратно в тип значения.
Пример "boxing" и "unboxing":
int val = 123;
object obj = val; // Boxing
int valAgain = (int)obj; // Unboxing
Различия
✅ref и out используются для передачи переменных по ссылке, позволяя методам изменять исходные значения переменных.
✅"Boxing" и "unboxing" касаются управления типами данных, позволяя значениям типов переходить между сферами значений и ссылок. Это влияет на производительность из-за дополнительных затрат на память и время выполнения.
ref и out применяются для управления поведением переменных при передаче в методы, в то время как "boxing" и "unboxing" связаны с преобразованием типов значений в типы ссылок и наоборот в контексте управления памятью.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых5 002
Cамый простой способ изучить Java — залезть в голову профи
Один из лучших айтишников России учит базе кодинга в Telegram. Даже гуманитарий поймёт, как создавать приложения, сайты, игры и чат-боты.
Достаточно подписаться на «Секреты Java», где каждый день появляются гайды, готовые примеры кода и лучших практик.
И всё это бесплатно — вместо сотен тысяч рублей за курсы. Стартовать в прибыльной профессии с нуля вы сможете гораздо проще!
Теперь обучиться Java может каждый: @java_secrets
5 002
Может ли быть несколько блоков catch ?
Спросят с вероятностью 22%
Можно использовать несколько блоков
catch с одним блоком try. Это позволяет обрабатывать различные типы исключений по-разному, в зависимости от конкретной ошибки, которая произошла во время выполнения кода в блоке try.
Принцип работы
Когда в блоке try возникает исключение, среда выполнения .NET ищет первый блок catch, который может обработать это исключение на основе типа возникшего исключения. Процесс поиска начинается с первого блока catch, следующего за блоком try, и продолжается в порядке их объявления, пока не будет найден подходящий обработчик. Если подходящий обработчик не найден, исключение передается дальше по стеку вызовов.
try
{
// Здесь код, который может генерировать исключения
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[3]); // Это вызовет IndexOutOfRangeException
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("Индекс выходит за границы массива!");
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Попытка деления на ноль!");
}
catch (Exception ex)
{
Console.WriteLine($"Неизвестная ошибка: {ex.Message}");
}
Рекомендации по использованию
1️⃣Специфичность: Помещайте более специфичные обработчики исключений (например, IndexOutOfRangeException) перед более общими (например, Exception), чтобы обеспечить правильную обработку конкретных ошибок.
2️⃣Обработка исключений: В каждом блоке catch следует размещать код, который способен корректно обработать исключение, соответствующее этому блоку. Не злоупотребляйте общими обработчиками, так как это может замаскировать истинную природу ошибки.
3️⃣Логирование: Желательно логировать информацию об исключении, чтобы позже можно было проанализировать причины ошибок.
Использование нескольких блоков catch позволяет писать более надежный и управляемый код, что особенно важно в крупных и сложных приложениях, где разные типы ошибок требуют различных способов восстановления после сбоев.
Возможно и даже рекомендуется использовать несколько блоков catch с одним блоком try для точной и эффективной обработки различных типов исключений. Это улучшает управляемость ошибками и повышает надежность программы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых5 002
Чем отличается метод Equal от == ?
Спросят с вероятностью 33%
Метод Equals и оператор
== используются для сравнения объектов, но есть важные отличия в том, как они работают и когда их следует использовать.
Оператор ==
Обычно используется для сравнения двух объектов на равенство. По умолчанию для ссылочных типов (классов) он проверяет равенство ссылок, то есть две переменные считаются равными, если они указывают на один и тот же объект в памяти.
✅Переопределение: Можно переопределить для классов, чтобы изменить его поведение по умолчанию и включить сравнение по значению или какой-либо другой критерий. Это делается путем определения метода оператора для == и, обычно, для !=.
Метод Equals
✅Определение: Предназначен для сравнения текущего объекта с другим объектом на предмет их эквивалентности. Для типов значений (например, int, double) Equals сравнивает значения. Для ссылочных типов базовая реализация Object.Equals также проверяет равенство ссылок.
✅Переопределение: Может быть переопределён, чтобы обеспечить сравнение по значению или другим критериям для классов. Это часто делается для классов, где семантическое "равенство" объектов определяется не только их идентичностью в памяти.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
Person other = (Person)obj;
return (Name == other.Name) && (Age == other.Age);
}
public override int GetHashCode()
{
return HashCode.Combine(Name, Age);
}
public static bool operator ==(Person left, Person right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (left is null || right is null)
{
return false;
}
return left.Equals(right);
}
public static bool operator !=(Person left, Person right)
{
return !(left == right);
}
}
В этом примере Equals и == переопределены так, что они сравнивают объекты Person на основе их свойств Name и Age, а не по ссылкам.
✅Используйте == для проверки идентичности объектов или если нужно переопределить поведение сравнения для типов, определяемых пользователем.
✅Используйте Equals для более формального и потенциально различного в каждом классе определения равенства.
✅Всегда переопределяйте GetHashCode при переопределении Equals или ==, чтобы поддерживать согласованность поведения в коллекциях, основанных на хэш-таблицах.
== — это оператор, который по умолчанию проверяет равенство ссылок для классов, но его можно переопределить. Equals — это метод, который можно переопределить для определения "равенства" в терминах значений или состояний объектов.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых5 002
Для чего нужны не реаляционые базы данных ?
Спросят с вероятностью 22%
Нереляционные базы данных, часто называемые NoSQL (Not Only SQL), представляют собой тип систем управления базами данных, который отличается от традиционных реляционных баз данных управления (РБДУ) своим подходом к организации, хранению и управлению данными. Основные причины использования нереляционных баз данных включают следующие аспекты:
1️⃣Гибкость схемы
Обычно не требуют фиксированной схемы данных, что делает их идеальными для случаев, когда данные неструктурированы или имеют различные структуры. Это позволяет разработчикам легко добавлять, удалять или модифицировать данные без необходимости менять всю структуру базы.
2️⃣Масштабируемость
NoSQL базы данных часто обеспечивают лучшую горизонтальную масштабируемость, то есть способность базы данных расширяться путём добавления большего количества серверов в пул ресурсов. Это особенно полезно для приложений, работающих с большими объёмами данных и высоким уровнем запросов, например, в больших интернет-проектах.
3️⃣Производительность
Благодаря оптимизации под конкретные типы запросов и данных, некоторые NoSQL системы могут обеспечить более высокую производительность по сравнению с реляционными базами данных, особенно когда речь идет о больших объемах данных и распределенных системах.
4️⃣Многообразие типов данных
NoSQL предлагает различные типы хранилищ, такие как документо-ориентированные, ключ-значение, колоночные магазины и графовые базы данных, каждый из которых оптимизирован для специфических типов запросов и приложений.
Примеры:
1️⃣Документо-ориентированные базы данных (например, MongoDB, CouchDB) хорошо подходят для хранения, извлечения и управления документо-ориентированной информацией как JSON или XML.
2️⃣Базы данных типа ключ-значение (например, Redis, DynamoDB) используются для хранения данных в виде словаря (ключ-значение), что идеально подходит для сессий пользователей, кэширования.
3️⃣Колоночные магазины (например, Cassandra, HBase) эффективны для аналитики больших данных, где необходимо быстро читать и записывать в огромные объёмы данных.
4️⃣Графовые базы данных (например, Neo4j, ArangoDB) оптимальны для данных, которые естественным образом представляют собой сети, например, социальные связи, сети доставки, системы рекомендаций.
Нереляционные базы данных используются для обеспечения высокой гибкости, масштабируемости и производительности при работе с большими или сложными данными, которые трудно обрабатывать в стандартных реляционных СУБД. Эти системы особенно полезны в современных веб-приложениях, системах реального времени и в условиях, требующих эффективной работы с разнообразными или быстро изменяющимися данными.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
5 002
Что такое стек ?
Спросят с вероятностью 33%
"стек" (stack) — это тип структуры данных, который работает по принципу "последний пришёл — первый вышел" (Last In, First Out — LIFO). Этот принцип означает, что последние добавленные элементы будут извлечены из стека первыми. Стек можно представить как стопку тарелок: вы можете добавлять новые тарелки на верх стопки и также снимать верхнюю тарелку, но доступ к тарелкам, находящимся в середине стопки, без снятия верхних слоёв, невозможен.
Основные операции со стеком
✅Push: добавление элемента на вершину стека.
✅Pop: удаление и возвращение элемента с вершины стека.
✅Peek: возвращает элемент на вершине стека без его удаления.
✅IsEmpty: проверка стека на пустоту.
Стеки широко используются в программировании для решения множества задач, включая:
✅Обработка вызовов функций/процедур: Используется для отслеживания точек входа и выхода из функций во время выполнения программы.
✅Алгоритмы обратной полский нотации: Его использование для вычисления арифметических выражений, записанных в постфиксной форме.
✅Откат операций: в редакторах, где последние изменения можно отменить в обратном порядке.
using System;
using System.Collections.Generic;
public class SimpleStack
{
private Stack<int> stack = new Stack<int>();
public void Push(int number)
{
stack.Push(number);
Console.WriteLine($"Pushed {number} to stack.");
}
public int Pop()
{
int number = stack.Pop();
Console.WriteLine($"Popped {number} from stack.");
return number;
}
public int Peek()
{
int number = stack.Peek();
Console.WriteLine($"Peeked at {number} on stack.");
return number;
}
public bool IsEmpty()
{
return stack.Count == 0;
}
}
class Program
{
static void Main()
{
var myStack = new SimpleStack();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Peek();
myStack.Pop();
myStack.Pop();
myStack.Pop();
}
}
Стек — это структура данных, работающая по принципу LIFO, что означает, что последний сохранённый элемент будет первым извлечённым. Этот тип структуры используется во многих аспектах программирования, включая управление памятью, парсинг выражений и откат изменений.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых5 002
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке
5 002
Что такое идентификация, аутентификация и авторизация ?
Спросят с вероятностью 22%
Идентификация, аутентификация и авторизация — это три ключевых компонента систем безопасности, используемые для защиты информации и ресурсов. Хотя эти термины часто используются взаимозаменяемо, они относятся к различным процессам и выполняют разные функции в контексте управления доступом.
Идентификация
Это процесс, в ходе которого пользователь или система предъявляет утверждение о своей личности. Например, когда пользователь вводит своё имя пользователя на веб-сайте, он проходит процесс идентификации. Это первый шаг в процессе управления доступом, который сообщает системе, кто пытается получить доступ. Идентификация сама по себе не доказывает личность пользователя, она только утверждает, кем этот пользователь является или представляется.
Аутентификация
Это процесс проверки утверждения идентификации. Этот процесс подтверждает, что пользователь или система действительно является тем, кем утверждается. Аутентификация часто требует предъявления одного или нескольких доказательств (факторов), которые могут включать:
✅Что-то, что знает пользователь (например, пароль, PIN-код)
✅Что-то, что имеет пользователь (например, смарт-карта, мобильное устройство)
✅Что-то, что является частью пользователя (например, биометрические данные, такие как отпечаток пальца или распознавание лица)
Авторизация
Это процесс предоставления или отказа в доступе к ресурсам после того, как пользователь успешно прошел идентификацию и аутентификацию. Это включает определение прав и привилегий пользователя к ресурсам, таким как файлы, базы данных, финансовые данные или функциональные возможности. Авторизация обычно настраивается через политики безопасности, которые определяют, какие ресурсы доступны для разных пользователей или групп.
Пример:
Представим, что вы хотите получить доступ к вашему банковскому аккаунту онлайн:
1️⃣Идентификация: Вы вводите своё имя пользователя на сайте банка.
2️⃣Аутентификация: Вы вводите свой пароль и, возможно, проходите двухфакторную аутентификацию через SMS-код, отправленный на ваш телефон.
3️⃣Авторизация: После успешной аутентификации банк проверяет, к каким функциям банковского аккаунта у вас есть доступ и разрешает вам совершать определенные операции.
Эти три процесса обеспечивают безопасный и эффективный контроль доступа к информационным ресурсам и системам.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
5 002
Как работает сборка мусора на платформе .NET ?
Спросят с вероятностью 33%
Сборка мусора (Garbage Collection, GC) — это автоматический процесс управления памятью, который обеспечивает освобождение памяти, занимаемой объектами, которые больше не используются в программе. Она позволяет разработчикам не заботиться о ручном управлении памятью, что значительно уменьшает количество ошибок, связанных с утечками памяти и другими проблемами управления ресурсами.
Как это работает?
Система сборки мусора работает в несколько этапов:
1️⃣Маркировка (Marking): GC проходит по всем активным объектам (объекты, на которые существуют ссылки и которые ещё используются) и помечает их как "достижимые". Это делается с помощью трассировки, которая начинается с корневых объектов (например, локальных переменных и статических полей) и последовательно отслеживает все объекты, на которые эти корни ссылаются.
2️⃣Очистка (Sweeping): После маркировки всех доступных объектов, GC идентифицирует все непомеченные объекты как "недостижимые" и освобождает память, которую они занимали.
3️⃣Компактификация (Compacting): Необязательный шаг, который уменьшает фрагментацию памяти путём перемещения объектов, что оптимизирует производительность памяти и ускоряет доступ к объектам.
.NET использует концепцию поколений для оптимизации процесса сборки мусора:
✅Поколение 0: Сюда попадают все новые объекты. Это поколение собирается чаще всего.
✅Поколение 1: Содержит объекты, которые пережили одну сборку мусора. Это промежуточное хранилище между часто и редко собираемыми объектами.
✅Поколение 2: Сюда попадают объекты, которые пережили две сборки мусора. Сборка мусора в этом поколении происходит реже, что позволяет снизить нагрузку на систему.
Производительность и оптимизация
Хотя сборка мусора упрощает управление памятью, она может привести к проблемам с производительностью, особенно если GC активируется слишком часто или занимает слишком много времени. Разработчики могут оптимизировать работу с памятью, например, используя пулы объектов, минимизируя выделения в критических по производительности участках кода или изменяя конфигурацию GC в соответствии с требованиями приложения.
Сборка мусора в .NET — это автоматический процесс, который управляет памятью путем удаления объектов, которые больше не используются. Этот процесс помогает избежать утечек памяти и упрощает разработку за счёт автоматизации управления памятью. GC делает приложения более стабильными и уменьшает вероятность ошибок, связанных с памятью.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 466 вопроса на C# разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
