C# | Вопросы собесов
5.1K subscribers
35 photos
1 video
1 file
994 links
Download Telegram
🤔 Внешние ключи должны быть в базе данных?

Внешние ключи обеспечивают целостность данных, связывая таблицы.
1. Они полезны для предотвращения ошибок, например, удаления связанных записей.
2. Однако в некоторых случаях (например, масштабируемые системы) можно использовать программную логику вместо внешних ключей для повышения производительности.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Для чего нужны методы service configuration?

В ASP.NET Core методы Service Configuration используются для настройки и регистрации зависимостей в контейнере внедрения зависимостей (Dependency Injection, DI). Это позволяет управлять зависимостями в приложении, делая код более гибким, тестируемым и удобным для расширения.

🚩Где происходит настройка сервисов?

Настройка сервисов выполняется в методе ConfigureServices(IServiceCollection services), который находится в классе Program.cs или Startup.cs (в зависимости от версии .NET).
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // Добавление контроллеров для API
services.AddDbContext<ApplicationDbContext>(); // Регистрация контекста базы данных
services.AddScoped<IMyService, MyService>(); // Внедрение зависимости
}


🚩Основные виды регистрации сервисов

🟠`AddSingleton<T>`
создаёт единственный экземпляр объекта на всё время работы приложения.
services.AddSingleton<ILogger, ConsoleLogger>();


🟠`AddScoped<T>`
создаёт один экземпляр объекта на каждый HTTP-запрос.
services.AddScoped<IUserService, UserService>();


🟠`AddTransient<T>`
создаёт новый экземпляр объекта при каждом запросе.
services.AddTransient<IEmailSender, EmailSender>();


🚩Пример использования в контроллере

public class HomeController : Controller
{
private readonly IMyService _myService;

public HomeController(IMyService myService)
{
_myService = myService;
}

public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое делегаты и зачем они нужны?

Делегаты в C# — это типы, которые представляют собой ссылки на методы с определенной сигнатурой. Делегаты позволяют передавать методы в качестве параметров другим методам, что делает код более гибким и модульным. Делегаты используются для обратных вызовов (callbacks), событий и многопоточности. Они являются основой событийной модели C# и упрощают взаимодействие между объектами.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1💊1
🤔 Зачем сделали 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 полезен для методов, которые должны вернуть несколько значений или инициализировать объекты, которые не могут быть инициализированы заранее.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🤔 Что такое DNS?

Это система, преобразующая доменные имена (например, example.com) в IP-адреса.
1. Она позволяет браузеру найти нужный сервер по имени.
2. Использует иерархическую структуру, начиная с корневых серверов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое В3 индекс?

Это структура данных, используемая в системах управления базами данных (СУБД) для организации и ускорения доступа к данным. B-tree индекс является сбалансированным деревом, обеспечивающим эффективное выполнение операций поиска, вставки, удаления и диапазонного поиска. B-tree индекс используется большинством реляционных СУБД, таких как SQL Server, MySQL, PostgreSQL и Oracle.

🚩Основные характеристики B-tree индекса

🟠Сбалансированное дерево
B-tree индекс является сбалансированным деревом, где все листья находятся на одном уровне. Это обеспечивает равномерное время доступа к данным.

🟠Ключи и значения
В узлах B-tree хранятся ключи, которые могут ссылаться на строки в таблице или на другие узлы дерева.

🟠Упорядоченность
Ключи в каждом узле упорядочены, что позволяет эффективно выполнять бинарный поиск внутри узла.

🟠Диапазонные запросы
B-tree индекс эффективно поддерживает диапазонные запросы (например, поиск всех записей с ключами между заданными значениями).

🟠Динамическое поддержание
B-tree автоматически сбалансирован, что позволяет эффективно выполнять операции вставки, удаления и обновления.

🚩Пример использования

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DepartmentID INT,
Salary DECIMAL(10, 2)
);

CREATE INDEX idx_lastname ON Employees(LastName);


🚩Операции

🟠Поиск
Операция поиска в B-tree выполняется за логарифмическое время O(log n), где n — количество узлов.
SELECT * FROM Employees WHERE LastName = 'Smith';   


🟠Диапазонный поиск
Диапазонные запросы, такие как поиск всех сотрудников с фамилией от 'A' до 'M', выполняются эффективно.
SELECT * FROM Employees WHERE LastName BETWEEN 'A' AND 'M';   


🟠Вставка
При вставке новой записи в таблицу с индексом B-tree, запись добавляется в соответствующее место, поддерживая балансировку дерева.
INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES (1, 'John', 'Doe', 10, 60000.00);


🟠Удаление
При удалении записи соответствующий ключ удаляется из B-tree, и дерево автоматически перестраивается, чтобы сохранить балансировку.
DELETE FROM Employees WHERE EmployeeID = 1;   


🚩Плюсы

Быстрый доступ
Обеспечивает быстрый доступ к данным благодаря сбалансированной структуре дерева.
Эффективная работа с большими объемами данных
Поддерживает операции вставки, удаления и поиска с логарифмической сложностью.
Поддержка диапазонных запросов
Эффективно обрабатывает диапазонные запросы благодаря упорядоченной структуре.
Автоматическая балансировка
Динамическая балансировка дерева обеспечивает равномерное время доступа и вставки/удаления.

🚩Минусы

Использование ресурсов
Требует дополнительного пространства для хранения структуры дерева и ключей.
Затраты на поддержание
Вставка и удаление могут требовать перестроения узлов, что влечет за собой дополнительные вычислительные затраты.
Фрагментация
При частых операциях вставки и удаления может возникнуть фрагментация, что может потребовать периодического обслуживания (например, реорганизации индекса).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое change трекинг?

Change Tracking — это механизм отслеживания изменений в объектах, используемый, например, в Entity Framework. Он позволяет фиксировать изменения в данных, чтобы при сохранении в базу данных обновлять только изменённые поля.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какая разница между структурой и классом в C#?

В C#, структуры (struct) и классы (class) являются двумя основными средствами для создания сложных типов. Основное различие заключается в типе хранения: структуры — это типы значений, которые хранятся непосредственно в стеке, тогда как классы — это типы ссылок, объекты которых хранятся в управляемой куче. Структуры лучше подходят для небольших данных, которые часто копируются, в то время как классы лучше подходят для больших данных и комплексного поведения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3🔥1
🤔 Как по ключу получить значение?

Для получения значения по ключу в словаре (Dictionary<TKey, TValue>) используются методы и свойства, такие как индексатор [], метод TryGetValue, и метод ContainsKey.

🟠Индексатор `[]`
Индексатор позволяет получить значение по ключу напрямую. Если ключ отсутствует в словаре, будет выброшено исключение KeyNotFoundException.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

try
{
string value = dictionary[2]; // Получение значения по ключу 2
Console.WriteLine(value); // Выведет "Two"
}
catch (KeyNotFoundException)
{
Console.WriteLine("Key not found");
}


🟠Метод `TryGetValue`
Метод TryGetValue позволяет безопасно получить значение по ключу. Он возвращает true, если ключ найден, и false, если ключ отсутствует. При этом значение записывается в выходной параметр.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

if (dictionary.TryGetValue(2, out string value))
{
Console.WriteLine(value); // Выведет "Two"
}
else
{
Console.WriteLine("Key not found");
}


🟠Метод `ContainsKey`
Метод ContainsKey проверяет наличие ключа в словаре. Его можно использовать в сочетании с индексатором для получения значения.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

if (dictionary.ContainsKey(2))
{
string value = dictionary[2];
Console.WriteLine(value); // Выведет "Two"
}
else
{
Console.WriteLine("Key not found");
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В качестве ключа могут использоваться одинаковые значения?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое IQueryable?

Это интерфейс, который наследуется от IEnumerable и предоставляет функциональность для оценки запросов к источнику данных. Основное отличие IQueryable от IEnumerable заключается в том, что IQueryable позволяет запросы быть построенными и выполненными отложенно на стороне источника данных, такого как база данных. Это обеспечивает большую эффективность, поскольку именно необходимые данные извлекаются и передаются, вместо извлечения всего объема данных и их фильтрации на стороне клиента.

🚩Как работает IQueryable

Использует LINQ-провайдеры, которые транслируют выражения LINQ в запросы, специфичные для источника данных (например, SQL для баз данных). Это позволяет делать запросы более оптимальными, так как они обрабатываются средствами самого источника данных.

🟠Отложенное выполнение (Deferred Execution)
Запросы IQueryable не выполняются, пока не будут перечислены. Это позволяет системе строить более сложные запросы перед их выполнением.

🟠Составление запросов
Вы можете построить запрос по частям, добавляя условия на каждом шаге. Финальный запрос выполняется только при перечислении результатов, что позволяет избежать ненужной нагрузки на источник данных.

🟠Преобразование запросов
LINQ-провайдеры могут преобразовать выражения запросов IQueryable в оптимизированные запросы к базе данных или другим источникам, что позволяет выполнять сложные операции на стороне сервера, такие как сортировка, группировка и агрегирование.

using (var context = new MyDbContext()) // MyDbContext — это контекст Entity Framework
{
IQueryable<Product> query = context.Products.Where(p => p.Price > 100);

// Запрос еще не выполнен, можно добавить другие условия
query = query.OrderBy(p => p.Name);

// Запрос выполняется только при перечислении
foreach (var product in query)
{
Console.WriteLine($"{product.Name}: {product.Price}");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Media is too big
VIEW IN TELEGRAM
📺 База 1000+ реальных собеседований

На программиста, тестировщика, аналитика, проджекта и другие IT профы.

Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.

🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram опубликовал список 8 самых быстрорастущих каналов для программистов:

Only Python — Подборки приёмов и фич, о которых не рассказывают в курсах.

Only Tech — Главные тренды и инсайды из мира технологий, маркетинга и интернет-культуры.

Only Hack — Реальные кейсы кибератак, инструменты и методы защиты, которые используют хакеры.

Only GitHub — Репозитории, которые решают реальные задачи.
Скрипты, фреймворки и готовые решения

Only IT — Без мнений и слухов — только факты и важные IT-события.

Only Apple — Новые апдейты, утечки и фишки, которые Apple ещё не показала.

Only GPT — Промпты, хаки и свежие инструменты, о которых молчат даже AI-каналы.

Only Memes — Если ты когда-нибудь деплоил в пятницу вечером — ты поймешь

Подписывайтесь и прокачивайте свои скиллы.
🤔 В чём отличие решения задачи через рекурсию и цикл?

- Рекурсия:
- Решение разбивается на подзадачи.
- Удобна для алгоритмов с вложенной логикой (деревья, обходы).
- Может привести к переполнению стека при глубокой рекурсии.
- Цикл:
- Экономичен по памяти.
- Лучше для итеративных, линейных задач.
- Может быть сложнее читаем в рекурсивных задачах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2