C# собеседования
789 subscribers
104 photos
222 links
Подготовка к собеседованиям на позицию C#-разработчик

Еще больше на сайте https://frontview-it.ru

Backend собеседования - @frontview_backend
C# работа - @frontview_csharp_vacancies
Все IT вакансии - @frontview_all_vacancies
По рекламе - @frontviewit
Download Telegram
🔘Ключевое слово static используется для определения членов класса, которые принадлежат самому классу, а не его экземплярам. Статические поля и методы общие для всех объектов класса и могут быть вызваны без создания экземпляра.


class Counter {
public static int Count = 0; // статическое поле

public static void Increment() { // статический метод
Count++;
}
}

Counter.Increment(); // вызов статического метода
Console.WriteLine(Counter.Count); // доступ к статическому полю


- Статические поля инициализируются один раз и существуют на протяжении всего времени работы программы.
- Статические методы могут обращаться только к статическим членам класса.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Для удаления метода из делегата используется оператор -=, который удаляет указанный метод из списка вызовов делегата. Если метод не найден в списке, операция не приводит к ошибке.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Action, Func и Predicate — это встроенные делегаты в C#.

- Action используется для методов, которые не возвращают значение (void). Может принимать от 0 до 16 параметров.

Action<int> printNumber = (x) => Console.WriteLine(x);


- Func используется для методов, возвращающих значение. Последний тип в шаблоне указывает тип возвращаемого значения.

Func<int, int, int> sum = (a, b) => a + b;


- Predicate — это специализированный делегат, возвращающий bool. Обычно используется для проверки условий.

Predicate<int> isEven = (x) => x % 2 == 0;


Action и Func более универсальны, а Predicate предназначен для логических проверок.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Абстрактный класс объявляется с помощью ключевого слова abstract. Он может содержать абстрактные методы (без реализации) и обычные методы с реализацией, но не может быть инстанцирован напрямую.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Логические операторы && (И) и || (ИЛИ) используются для выполнения операций над булевыми значениями.

- && (И)
Возвращает true, если оба операнда истинны. Если первый операнд ложный, второй не вычисляется (короткое замыкание).

- || (ИЛИ)
Возвращает true, если хотя бы один из операндов истинный. Если первый операнд истинный, второй не вычисляется (короткое замыкание).

Пример:

bool a = true, b = false;
bool result1 = a && b; // false, так как b ложное
bool result2 = a || b; // true, так как a истинное


Короткое замыкание позволяет оптимизировать вычисления и избежать ошибок, связанных с выполнением ненужных операций.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Для чтения всего текста из файла используется метод File.ReadAllText, который принимает путь к файлу и возвращает содержимое в виде строки. Этот метод автоматически закрывает файл после чтения, что упрощает работу с ресурсами.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🔸 Анонимные методы — это способ создания делегатов без явного объявления отдельного метода. Они позволяют определять логику непосредственно в месте использования, что упрощает код для коротких операций.

Пример:

Func<int, int, int> sum = delegate(int a, int b) { return a + b; };
int result = sum(2, 3); // Результат: 5


Анонимные методы часто заменяются лямбда-выражениями, но могут быть полезны в случаях, когда требуется совместимость с более старыми версиями языка.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
TaskCompletionSource — это класс, который позволяет создавать и управлять задачами (Task) вручную, предоставляя возможность устанавливать их состояние (завершение, отмена, ошибка). Он используется для интеграции асинхронных операций, которые не основаны на async/await, или для обертки событий в задачи.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🟠Для реализации IDisposable в классе используется шаблон Disposable, который включает финализатор и метод Dispose. Это позволяет корректно освобождать управляемые и неуправляемые ресурсы.

Пример:

public class Resource : IDisposable {
private bool disposed = false;

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

public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}

~Resource() {
Dispose(false);
}
}


Метод Dispose вызывается явно для освобождения ресурсов, а финализатор гарантирует очистку, если Dispose не был вызван.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс — это контракт, который определяет набор методов, свойств и событий, но не содержит их реализации. Классы, реализующие интерфейс, обязаны предоставить реализацию всех его членов, что обеспечивает единообразие и гибкость в проектировании.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
AggregateException — это специальный тип исключения, который используется для объединения нескольких исключений в одно. Это часто происходит в асинхронных операциях или при параллельном выполнении задач, где может возникнуть несколько ошибок одновременно.


try {
Task.WaitAll(task1, task2); // Может выбросить AggregateException
}
catch (AggregateException ex) {
foreach (var innerEx in ex.InnerExceptions) {
Console.WriteLine(innerEx.Message); // Обработка каждого внутреннего исключения
}
}


Этот тип исключения позволяет обработать все ошибки в одном месте.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Обобщенные делегаты — это делегаты, которые могут работать с любыми типами данных, указанными в качестве параметров. Они позволяют создавать гибкие и типобезопасные методы обратного вызова, не привязываясь к конкретным типам.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
😎Рекурсия — это подход, при котором функция вызывает саму себя для решения задачи. Она состоит из двух частей: базового случая (условие выхода) и рекурсивного случая (вызов функции с измененными параметрами).


int Factorial(int n) {
if (n == 0) // Базовый случай
return 1;
return n * Factorial(n - 1); // Рекурсивный случай
}


Базовый случай предотвращает бесконечную рекурсию, а рекурсивный случай разбивает задачу на более простые подзадачи. Рекурсия часто используется для работы с деревьями, графами и алгоритмами, где задача естественно делится на подзадачи.

Важно учитывать глубину рекурсии, чтобы избежать переполнения стека.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
IAsyncEnumerable<T> — это интерфейс, который позволяет асинхронно возвращать последовательности данных. Он используется для работы с потоками данных, которые генерируются или извлекаются асинхронно.


async IAsyncEnumerable<int> FetchDataAsync() {
for (int i = 0; i < 10; i++) {
await Task.Delay(100); // Асинхронная задержка
yield return i; // Возврат элемента последовательности
}
}


Для потребления данных используется await foreach:


await foreach (var item in FetchDataAsync()) {
Console.WriteLine(item);
}


IAsyncEnumerable<T> полезен при работе с асинхронными источниками данных, такими как базы данных, сетевые запросы или файловые потоки, где данные поступают постепенно.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
DateTime — это структура в C#, предназначенная для работы с датами и временем. Она предоставляет методы для создания, манипуляции и форматирования временных данных.


using System;

DateTime now = DateTime.Now; // Текущая дата и время
DateTime specificDate = new DateTime(2023, 10, 15); // Создание конкретной даты

TimeSpan difference = now - specificDate; // Разница между датами
Console.WriteLine("Days difference: " + difference.Days); // Вывод разницы в днях

DateTime futureDate = now.AddDays(7); // Добавление 7 дней к текущей дате
Console.WriteLine("Formatted date: " + futureDate.ToString("yyyy-MM-dd")); // Форматирование даты


DateTime поддерживает арифметику дат, сравнение и форматирование, что делает его удобным для работы с временными данными.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Слабые ссылки (WeakReference) позволяют ссылаться на объект, не препятствуя его сборке мусора. Это полезно для кэширования или управления памятью, когда объект может быть удален, если на него нет сильных ссылок.


using System;

var strongRef = new object();
var weakRef = new WeakReference(strongRef); // Создание слабой ссылки

Console.WriteLine("Is alive: " + weakRef.IsAlive); // Проверка, жив ли объект

strongRef = null; // Удаление сильной ссылки
GC.Collect(); // Принудительный вызов сборщика мусора

Console.WriteLine("Is alive after GC: " + weakRef.IsAlive); // Объект может быть удален


Слабые ссылки не удерживают объект в памяти, что позволяет избежать утечек памяти, но требует проверки на доступность объекта перед использованием.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
LINQ to Objects — это технология, позволяющая выполнять запросы к коллекциям в памяти, таким как массивы, списки и другие типы, реализующие IEnumerable<T>. LINQ предоставляет удобный синтаксис для фильтрации, сортировки, группировки и преобразования данных.


using System;
using System.Linq;
using System.Collections.Generic;

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList(); // Фильтрация четных чисел

foreach (var num in evenNumbers) {
Console.WriteLine(num); // Вывод результата
}


LINQ to Objects использует методы расширения, такие как Where, Select, OrderBy, что делает код более читаемым и выразительным. Это мощный инструмент для работы с коллекциями.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
▶️Thread — низкоуровневая абстракция операционной системы для выполнения кода параллельно. Потоки создаются напрямую через класс Thread, управляются вручную и потребляют значительные ресурсы.

Task — высокоуровневая абстракция, представляющая асинхронную операцию. Работает поверх пула потоков, что снижает нагрузку. Задачи упрощают управление асинхронным кодом через await/async.


// Создание и запуск потока
var thread = new Thread(() => Console.WriteLine("Thread"));
thread.Start();

// Создание и запуск задачи
var task = Task.Run(() => Console.WriteLine("Task"));


Thread подходит для долгих операций с ручным управлением. Task предпочтительнее для асинхронных операций, так как интегрирован с современными языковыми возможностями.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Array — фиксированная по размеру коллекция с элементами одного типа. Размер задается при создании и не может быть изменен. Доступ к элементам быстрый по индексу.

List<T> — динамическая коллекция, автоматически расширяется при добавлении элементов. Поддерживает удобные методы (Add, Remove, Find). Работает медленнее Array при частых вставках/удалениях из-за перераспределения памяти.


// Создание массива
int[] array = new int[5];

// Создание списка
List<int> list = new List<int>();


Array эффективен для статических данных, List<T> — для динамических коллекций с изменяемым размером.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Enum (перечисление) — это тип данных, который позволяет задать набор именованных констант. Используется для улучшения читаемости кода и предотвращения ошибок, связанных с использованием "магических чисел".

enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}


В этом примере создается перечисление DayOfWeek, представляющее дни недели. Каждый элемент имеет числовое значение, начиная с 0 (Monday = 0, Tuesday = 1 и т.д.).

DayOfWeek today = DayOfWeek.Friday;
if (today == DayOfWeek.Friday)
{
Console.WriteLine("Сегодня пятница!");
}


Здесь переменной today присваивается значение Friday, и выполняется проверка на соответствие этому значению. Использование enum делает код более понятным и безопасным.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM