C# | Вопросы собесов @easy_c_sharp Channel on Telegram

C# | Вопросы собесов

@easy_c_sharp


Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.me/+nebTPWgpeGs1OWFi
Задачи t.me/+Xy-0H7xKlgo0NDVi
Вакансии t.me/+BQFHXZQ0zrViNGIy

C# | Вопросы собесов (Russian)

Вы мечтаете о карьере в области разработки на C#? У вас есть собеседование и хотите подготовиться максимально эффективно? Тогда канал "C# | Вопросы собесов" (@easy_c_sharp) - это то, что вам нужно! Здесь мы разбираем типичные вопросы, которые могут встретиться на собеседованиях для позиции C# разработчика

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

Помимо этого, мы предлагаем полезные ресурсы для вашего развития:n- Посетите наш сайт easyoffer.ru для дополнительной информацииn- Рекламные возможности на нашем канале: @easyoffer_advn- Пройдите тесты для самопроверки: t.me/+nebTPWgpeGs1OWFin- Решайте задачи для оттачивания навыков: t.me/+Xy-0H7xKlgo0NDVin- Ищите работу мечты: t.me/+BQFHXZQ0zrViNGIynnПрисоединяйтесь к нам, чтобы стать уверенным кандидатом и добиться успеха в сфере C# разработки! Уверены, что с нашей помощью вы достигнете новых высот в своей карьере!

C# | Вопросы собесов

13 Jan, 09:10


🤔 Что такое static?

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

🚩Основные моменты использования

🟠Поля
Статические поля объявляются с использованием ключевого слова static и принадлежат классу в целом. Все экземпляры класса разделяют одно и то же статическое поле.
public class Example
{
public static int Counter;
}

// Доступ к статическому полю
Example.Counter = 10;
Console.WriteLine(Example.Counter); // Выведет 10


🟠Методы
Статические методы могут быть вызваны без создания экземпляра класса. Статические методы могут обращаться только к другим статическим членам класса.
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}

// Вызов статического метода
int sum = Calculator.Add(5, 3);
Console.WriteLine(sum); // Выведет 8


🟠Свойства
Статические свойства похожи на статические поля, но с доступом через методы get и set.
public class Configuration
{
private static string _setting;

public static string Setting
{
get { return _setting; }
set { _setting = value; }
}
}

// Доступ к статическому свойству
Configuration.Setting = "My Setting";
Console.WriteLine(Configuration.Setting); // Выведет "My Setting"


🟠Конструкторы
Статические конструкторы используются для инициализации статических членов класса. Они вызываются один раз при первом обращении к статическим членам.
public class Database
{
public static string ConnectionString;

static Database()
{
ConnectionString = "Initial Catalog=myDatabase;Data Source=myServer;";
}
}

// При первом доступе вызывается статический конструктор
Console.WriteLine(Database.ConnectionString); // Выведет строку подключения


🚩Зачем нужен?

🟠Общие данные и функции:
Статические члены полезны для хранения данных или функций, которые должны быть общими для всех экземпляров класса.
🟠Упрощение доступа:
Позволяет вызывать методы и свойства без необходимости создавать экземпляр класса.
🟠Инициализация ресурсов:
Статические конструкторы полезны для инициализации ресурсов или настройки параметров, необходимых для работы класса.

🚩Ограничения

🟠Статические методы не могут обращаться к нестатическим членам напрямую, так как у них нет доступа к экземпляру класса.
🟠Статические конструкторы не могут иметь параметры и вызываются автоматически при первом обращении к классу.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

12 Jan, 16:10


🤔 Какие бывают самые популярные коды ошибок в HTTP?

1. 400 Bad Request: запрос клиента некорректен.
2. 401 Unauthorized: требуется аутентификация.
3. 403 Forbidden: доступ запрещён.
4. 404 Not Found: ресурс не найден.
5. 500 Internal Server Error: ошибка на стороне сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

12 Jan, 09:10


🤔 Что такое события?

Это механизм, который позволяет объектам уведомлять другие объекты о том, что произошло определенное действие. Это важная часть паттерна "наблюдатель" (observer pattern), который используется для реализации асинхронного взаимодействия между объектами.

🚩Основные компоненты событий

🟠Делегаты
Делегаты определяют сигнатуру методов, которые могут быть вызваны при возникновении события.

🟠События
События — это специальные делегаты, которые могут быть вызваны для уведомления подписчиков о происходящем действии.

🟠Подписчики
Объекты, которые подписаны на событие и реагируют на его вызов.

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

Определение делегата и события
public class Publisher
{
// Определение делегата
public delegate void NotifyEventHandler(object sender, EventArgs e);

// Определение события на основе делегата
public event NotifyEventHandler Notify;

// Метод, вызывающий событие
public void RaiseEvent()
{
if (Notify != null)
{
Notify(this, EventArgs.Empty);
}
}
}


Подписка на событие и обработчик события
public class Subscriber
{
public void OnNotify(object sender, EventArgs e)
{
Console.WriteLine("Получено уведомление о событии.");
}
}

class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();

// Подписка на событие
publisher.Notify += subscriber.OnNotify;

// Вызов события
publisher.RaiseEvent();
}
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

11 Jan, 16:10


🤔 Что такое DELETE?

Это HTTP-метод, используемый для удаления ресурса на сервере.
1. Указывает серверу удалить указанный ресурс по заданному URL.
2. Также является идемпотентным, так как повторные вызовы не изменяют результат.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

11 Jan, 09:10


🤔 В какой момент отправляется запрос к базе данных?

Запрос к базе данных отправляется в момент выполнения операций, которые требуют взаимодействия с базой данных. В контексте использования ORM, таких как Entity Framework, это происходит в определенные моменты, когда вы явно вызываете методы для сохранения изменений или выполнения запросов.

🚩Основные моменты отправки запросов к базе данных

🟠При вызове SaveChanges()
Все изменения, сделанные в контексте (например, добавление, обновление, удаление объектов), отправляются в базу данных.
     using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
context.SaveChanges(); // Запрос к базе данных отправляется здесь
}


🟠При выполнении LINQ-запросов с использованием методов, которые требуют данных из базы
Методы, такие как ToList(), FirstOrDefault(), SingleOrDefault(), Count(), и другие, вызывают выполнение запроса к базе данных для получения данных.
     using (var context = new AppDbContext())
{
var products = context.Products.ToList(); // Запрос к базе данных отправляется здесь
}


🟠При использовании методов асинхронного выполнения запросов
Асинхронные методы, такие как SaveChangesAsync(), ToListAsync(), и другие, также отправляют запросы к базе данных.
     using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
await context.SaveChangesAsync(); // Запрос к базе данных отправляется здесь
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

10 Jan, 16:10


🤔 Что такое PUT?

Это HTTP-метод, используемый для создания или полного обновления ресурса на сервере.
1. Если ресурс существует, он обновляется, а если нет — создаётся.
2. Это идемпотентный метод, что означает одинаковый результат при многократных вызовах с теми же данными.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

10 Jan, 09:10


🤔 Что такое ORM?

Это технология, которая позволяет автоматически связывать объекты в коде с таблицами в базе данных. Это упрощает работу с базой данных, позволяя разработчикам работать с данными как с объектами, а не писать сложные SQL-запросы.

🚩Плюсы

Упрощает работу с БД
Позволяет использовать объектно-ориентированный подход.
Автоматизация запросов
Генерирует SQL-запросы автоматически.
Поддержка транзакций
Управляет транзакциями на уровне объектов.
Поддержка миграций
Легко обновлять структуру БД через код.

Пример с Entity Framework (C#)
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}

public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}

// Использование
using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
context.SaveChanges();
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

09 Jan, 16:10


🤔 Где используются интерфейсы?

Интерфейсы применяются для создания контракта, который классы должны реализовать.
1. Обеспечивают гибкость и модульность, позволяя использовать зависимости через абстракции.
2. Используются в многократной реализации, так как классы могут реализовывать несколько интерфейсов.
3. Позволяют писать тестируемый код за счёт внедрения зависимостей (Dependency Injection).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

09 Jan, 12:56


📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

easyoffer
Backend

Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты

Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты

Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты

Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты

Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты

C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты

C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты

Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты

DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты

PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты

Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты

Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты

📊 Реклама в сети телеграм каналов easyoffer
✈️ Для заказа пишите @easyoffer_adv

C# | Вопросы собесов

09 Jan, 09:10


🤔 Зачем используется библиотека Moq?

Библиотека для создания заглушек (mock-объектов) в модульных тестах. Она позволяет изолировать тестируемый код от внешних зависимостей, таких как базы данных или веб-сервисы, упрощая и повышая надежность тестирования.

🚩Плюсы

Изоляция кода
Изолирует тестируемый код от внешних зависимостей.
Упрощение тестирования
Легко создавать заглушки и настраивать их поведение.
Проверка поведения
Проверяет вызовы методов заглушек, параметры и частоту вызовов.

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

Интерфейс и класс
public interface IUserRepository
{
User GetUserById(int id);
void SaveUser(User user);
}

public class UserService
{
private readonly IUserRepository _userRepository;

public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}

public void UpdateUser(int id, string newName)
{
var user = _userRepository.GetUserById(id);
if (user == null) throw new ArgumentException("User not found");

user.Name = newName;
_userRepository.SaveUser(user);
}
}

public class User
{
public int Id { get; set; }
public string Name { get; set; }
}


Модульный тест с Moq
using Moq;
using Xunit;

public class UserServiceTests
{
[Fact]
public void UpdateUser_ShouldUpdateUserName()
{
// Arrange
var mockRepository = new Mock<IUserRepository>();
var user = new User { Id = 1, Name = "Old Name" };
mockRepository.Setup(repo => repo.GetUserById(1)).Returns(user);

var userService = new UserService(mockRepository.Object);

// Act
userService.UpdateUser(1, "New Name");

// Assert
Assert.Equal("New Name", user.Name);
mockRepository.Verify(repo => repo.SaveUser(user), Times.Once);
}

[Fact]
public void UpdateUser_ShouldThrowExceptionIfUserNotFound()
{
// Arrange
var mockRepository = new Mock<IUserRepository>();
mockRepository.Setup(repo => repo.GetUserById(1)).Returns((User)null);

var userService = new UserService(mockRepository.Object);

// Act & Assert
Assert.Throws<ArgumentException>(() => userService.UpdateUser(1, "New Name"));
}
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

08 Jan, 16:10


🤔 Что такое куча?

Это область памяти, выделяемая динамически для объектов во время выполнения программы.
1. Используется для хранения объектов и данных, срок жизни которых заранее не известен.
2. Память в куче управляется сборщиком мусора (GC).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

08 Jan, 09:10


🤔 Что такое куки и где оно хранится в запросе?

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

🚩Основные свойства

🟠Имя (Name)
Уникальный идентификатор для каждого куки.
🟠Значение (Value)
Данные, которые хранит куки.
🟠Домен (Domain)
Домен, для которого куки действителен.
🟠Путь (Path)
Путь на сервере, для которого куки действителен.
🟠Время истечения (Expiration/Max-Age)
Дата или время, когда куки должен быть удален.
🟠Безопасность (Secure)
Указывает, что куки должны передаваться только через HTTPS.
🟠HTTPOnly
Указывает, что куки недоступен через JavaScript, только через HTTP(S) запросы.

🚩Где хранятся

🟠Установка куки с сервера (Set-Cookie)
Сервер отправляет куки в ответе на запрос клиента с использованием заголовка Set-Cookie.
   HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2023 10:18:14 GMT
Content-Type: text/html


🟠Отправка куки клиентом (Cookie)
Браузер автоматически добавляет соответствующие куки в заголовок Cookie при каждом последующем запросе к серверу, для которого эти куки действительны.
   GET /dashboard HTTP/1.1
Host: example.com
Cookie: sessionId=abc123


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

Установка куки на сервере (пример на Node.js с использованием Express)
const express = require('express');
const app = express();

app.get('/', (req, res) => {
// Устанавливаем куки
res.cookie('sessionId', 'abc123', {
maxAge: 900000,
httpOnly: true
});
res.send('Куки установлены');
});

app.listen(3000, () => {
console.log('Server is running on port 3000');
});


Доступ к куки на клиенте (пример на JavaScript)
// Установка куки
document.cookie = "username=JohnDoe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/";

// Получение всех куки
let cookies = document.cookie;
console.log(cookies);


🚩Важные моменты

🟠Безопасность
Куки с флагом Secure передаются только по HTTPS-соединениям. Куки с флагом HttpOnly недоступны через JavaScript, что помогает защитить их от XSS-атак.

🟠Размер и количество
Обычно один куки не должен превышать 4KB, и на одном домене может быть установлено не более 20-30 куки.

🟠Конфиденциальность
Куки могут содержать чувствительные данные, поэтому важно защищать их и использовать шифрование, если необходимо.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

07 Jan, 16:10


🤔 Что такое .NET Core?

Это кросс-платформенный фреймворк для разработки приложений.
1. Поддерживает Windows, macOS и Linux.
2. Легковесный, с открытым исходным кодом, предназначен для высокой производительности.
3. Подходит для разработки веб-приложений, облачных сервисов и микросервисов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

07 Jan, 09:10


🤔 Какие типы http запросов бывают и где в них передаются данные?

HTTP-запросы делятся на несколько типов, каждый из которых предназначен для выполнения определенных операций. Основные типы HTTP-запросов включают GET, POST, PUT, DELETE, PATCH и другие. Данные в этих запросах могут передаваться через URL, заголовки или тело запроса в зависимости от типа запроса и его назначения.

🚩Основные типы

🟠GET
Запрос для получения данных с сервера. Данные передаются в URL в виде параметров запроса.
GET /api/products?category=electronics&page=2 HTTP/1.1
Host: example.com


🟠POST
Запрос для отправки данных на сервер для создания ресурса. Данные передаются в теле запроса.
POST /api/products HTTP/1.1
Host: example.com
Content-Type: application/json

{
"name": "New Product",
"price": 19.99
}


🟠PUT
Запрос для отправки данных на сервер для обновления существующего ресурса. Данные передаются в теле запроса.
PUT /api/products/1 HTTP/1.1
Host: example.com
Content-Type: application/json

{
"name": "Updated Product",
"price": 29.99
}


🟠DELETE
Запрос для удаления ресурса на сервере. Данные могут передаваться в URL или заголовках, но тело запроса обычно не используется.
DELETE /api/products/1 HTTP/1.1
Host: example.com


🟠PATCH
Запрос для частичного обновления ресурса на сервере. Данные передаются в теле запроса.
PATCH /api/products/1 HTTP/1.1
Host: example.com
Content-Type: application/json

{
"price": 24.99
}


🟠HEAD
Запрос, аналогичный GET, но сервер возвращает только заголовки ответа без тела. Данные передаются в URL, как и в GET-запросе.
HEAD /api/products HTTP/1.1
Host: example.com


🟠OPTIONS
Запрос для получения поддерживаемых сервером методов HTTP для указанного ресурса. Данные передаются в URL.
OPTIONS /api/products HTTP/1.1
Host: example.com


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

GET-запрос с использованием fetch API в JavaScript
fetch('https://example.com/api/products?category=electronics&page=2')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));


POST-запрос с использованием fetch API в JavaScript
fetch('https://example.com/api/products', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'New Product',
price: 19.99
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

06 Jan, 16:10


🤔 Какие минусы у микросервисов?

1. Сложность разработки: управление большим числом сервисов требует дополнительных инструментов.
2. Усложнение взаимодействия: требуется настройка API и их маршрутизации.
3. Трудности тестирования и деплоя: распределённые системы сложнее тестировать и синхронизировать.
4. Затраты на ресурсы: каждый сервис требует выделения собственных ресурсов, что увеличивает их потребление.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

06 Jan, 09:10


🤔 Как работает Routing?

Маршрутизация в ASP.NET Core сопоставляет URL-запросы с контроллерами и действиями.

Определение маршрутов
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}


Пример контроллера
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}

public class ProductsController : Controller
{
public IActionResult Index() => View();
public IActionResult Details(int id) => View();
}


Атрибуты маршрутизации
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
return View();
}
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

05 Jan, 16:10


🤔 Какие есть принципы SOLID?

1. S: Принцип единственной ответственности (Single Responsibility Principle).
2. O: Принцип открытости/закрытости (Open/Closed Principle).
3. L: Принцип подстановки Барбары Лисков (Liskov Substitution Principle).
4. I: Принцип разделения интерфейсов (Interface Segregation Principle).
5. D: Принцип инверсии зависимостей (Dependency Inversion Principle).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

05 Jan, 09:10


🤔 Что такое DNS?

DNS (Domain Name System) переводит доменные имена (например, www.example.com) в IP-адреса (например, 192.0.2.1), чтобы компьютеры могли общаться.

🚩Основные шаги

1⃣Запрос от клиента
Браузер отправляет запрос к DNS-серверу.
2⃣Рекурсивный поиск
DNS-сервер обращается к корневым, TLD и авторитетным серверам.
3⃣Ответ
Авторитетный сервер возвращает IP-адрес.
4⃣Соединение
Браузер использует IP-адрес для соединения с веб-сайтом.

🚩Виды DNS-записей
🟠A
IPv4-адрес.
🟠AAAA
IPv6-адрес.
🟠CNAME
Псевдоним.
🟠MX
Почтовый сервер.
🟠TXT
Текстовые данные.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

04 Jan, 16:10


🤔 Какие есть виды полиморфизмов?

1. Компиляторный (статический): реализуется через перегрузку методов (overloading).
2. Исполнительный (динамический): достигается через переопределение методов (overriding) и виртуальные функции.
3. Полиморфизм позволяет обрабатывать объекты разных типов единообразно, например, через интерфейсы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

04 Jan, 09:10


🤔 Как браузер отправляет запрос и получает ответ от API?

Когда браузер отправляет запрос и получает ответ от API, это включает несколько шагов, которые следуют HTTP-протоколу. Этот процесс включает в себя создание и отправку HTTP-запроса, обработку на сервере и получение HTTP-ответа.

🚩Отправка запроса

🟠Инициация запроса
Обычно запрос инициируется через JavaScript с использованием встроенных функций, таких как XMLHttpRequest, fetch или сторонние библиотеки, такие как Axios.
   fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));


🟠Формирование HTTP-запроса
Метод: Указывает тип запроса (например, GET, POST, PUT, DELETE). URL: Указывает на какой URL отправляется запрос. Заголовки (Headers): Включают информацию о типе содержимого, авторизации и других метаданных. Тело (Body): Содержит данные, которые отправляются с запросом (для методов POST, PUT и PATCH).

🟠Отправка запроса
Браузер использует сетевые протоколы для отправки сформированного HTTP-запроса на указанный сервер через интернет.

🚩Обработка запроса на сервере

1⃣Получение запроса
Сервер получает HTTP-запрос.

2⃣Обработка запроса
Сервер обрабатывает запрос, выполняя соответствующие действия, такие как чтение данных из базы данных, выполнение логики приложения или взаимодействие с другими сервисами.

3⃣Формирование ответа
Статус код (Status Code): Указывает результат обработки запроса (например, 200 OK, 404 Not Found, 500 Internal Server Error). Заголовки (Headers): Могут включать метаданные о содержимом ответа, кэшировании и других параметрах. Тело (Body): Содержит данные, которые отправляются обратно клиенту, часто в формате JSON или XML.
   HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{
"id": 1,
"name": "Example",
"description": "This is an example response"
}


🚩Получение ответа

1⃣Получение ответа
Браузер получает HTTP-ответ от сервера.

2⃣Обработка ответа
Статус код: Браузер или JavaScript-код проверяет статус код, чтобы определить, был ли запрос успешным. Заголовки: Заголовки могут быть использованы для получения дополнительной информации о ответе. Тело: Браузер разбирает тело ответа, если это необходимо, например, преобразует JSON-данные в объект JavaScript.

3⃣Использование данных
Полученные данные могут быть использованы в приложении для обновления интерфейса пользователя, хранения в локальном хранилище или выполнения других действий.

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

Отправка запроса
fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
console.log('Data received:', data);
// Используем данные для обновления UI или других целей
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

03 Jan, 16:10


🤔 Какова концепция сборки мусора?

Сборщик мусора (Garbage Collector, GC) автоматически освобождает память от объектов, на которые больше нет ссылок.
1. Поколения памяти: объекты делятся на поколения (0, 1, 2) для оптимизации очистки.
2. Триггер срабатывания: GC запускается при нехватке памяти или явным вызовом.
3. Сбор поколений: сначала очищаются молодые объекты (0 поколение), а затем старшие.


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

03 Jan, 09:10


🤔 В чём преимущество блока using?

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

🚩Основные преимущества блока

🟠Автоматическое освобождение ресурсов
Блок using гарантирует, что метод Dispose() будет вызван автоматически, когда выполнение кода выйдет из блока using, даже если возникнет исключение. Это освобождает программиста от необходимости вручную вызывать Dispose() и уменьшает вероятность ошибок.
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
// StreamReader автоматически закрывается и освобождает ресурсы после выхода из блока using.


🟠Сокращение количества кода
Использование блока using уменьшает количество необходимого кода для обеспечения правильного освобождения ресурсов.
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// Работа с базой данных
}
// SqlConnection автоматически закрывается и освобождает ресурсы после выхода из блока using.


🟠Повышенная надежность
Блок using повышает надежность кода, так как гарантирует, что ресурсы будут освобождены даже в случае возникновения исключений.
try
{
using (StreamWriter writer = new StreamWriter("file.txt"))
{
writer.WriteLine("Hello, World!");
}
}
catch (Exception ex)
{
Console.WriteLine($"Произошла ошибка: {ex.Message}");
}
// StreamWriter автоматически закрывается и освобождает ресурсы после выхода из блока using, даже если произошла ошибка.


🟠Чистый и понятный код
Код, использующий блок using, выглядит более чистым и упрощает понимание и сопровождение.
using (MemoryStream memoryStream = new MemoryStream())
{
// Работа с MemoryStream
}
// MemoryStream автоматически освобождается после выхода из блока using.


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

Работа с файлами
using System;
using System.IO;

class Program
{
static void Main()
{
using (StreamReader reader = new StreamReader("example.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
// StreamReader автоматически закрывается и освобождает ресурсы после выхода из блока using.
}
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

02 Jan, 16:10


🤔 Какие бывают типы данных?

1. Примитивные: целые числа (int, long), числа с плавающей запятой (float, double), логические (bool), символы (char).
2. Ссылочные: классы, интерфейсы, массивы, строки.
3. Обобщённые (Generic): позволяют работать с типами данных, указанными при создании экземпляра (например, List<T>).
4. Пользовательские: структуры, перечисления (enum), типы, созданные программистом.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

02 Jan, 09:10


🤔 В чём разница между переопределением и сокрытием?

Это два различных механизма в C# для изменения поведения методов, свойств или событий, унаследованных от базового класса.

🚩Переопределение (override)

Переопределение используется для предоставления новой реализации метода, свойства или события в производном классе, который уже был объявлен в базовом классе как virtual, abstract или override.
Ключевое слово
override.

Требование
Метод базового класса должен быть объявлен с ключевым словом virtual или abstract.

public class BaseClass
{
public virtual void Display()
{
Console.WriteLine("BaseClass Display");
}
}

public class DerivedClass : BaseClass
{
public override void Display()
{
Console.WriteLine("DerivedClass Display");
}
}


Использование
BaseClass obj = new DerivedClass();
obj.Display(); // Выведет: "DerivedClass Display"


🚩Сокрытие (hiding)

Сокрытие используется для создания новой реализации метода, свойства или события в производном классе, который уже существует в базовом классе, но без использования virtual и override. При сокрытии используется ключевое слово new.

Ключевое слово
new.

Требование
Метод базового класса не обязательно должен быть объявлен с ключевым словом virtual.

public class BaseClass
{
public void Display()
{
Console.WriteLine("BaseClass Display");
}
}

public class DerivedClass : BaseClass
{
public new void Display()
{
Console.WriteLine("DerivedClass Display");
}
}


Использование
BaseClass obj1 = new BaseClass();
obj1.Display(); // Выведет: "BaseClass Display"

DerivedClass obj2 = new DerivedClass();
obj2.Display(); // Выведет: "DerivedClass Display"

BaseClass obj3 = new DerivedClass();
obj3.Display(); // Выведет: "BaseClass Display"


🚩Ключевые различия

🟠Виртуальные методы
Переопределение: Базовый метод должен быть объявлен как virtual, abstract или override. Сокрытие: Базовый метод не обязательно должен быть виртуальным.

🟠Ключевые слова
Переопределение: Используется ключевое слово override. Сокрытие: Используется ключевое слово new.

🟠Виртуальная таблица (vtable)
Переопределение: Изменяет указатель в виртуальной таблице базового класса, что позволяет полиморфизм. Сокрытие: Создает новый метод, который скрывает метод базового класса, но не изменяет виртуальную таблицу.

🟠Полиморфизм
Переопределение: Поддерживает полиморфизм. Вызовы методов производятся на основе реального типа объекта. Сокрытие: Не поддерживает полиморфизм. Вызовы методов зависят от типа ссылки, а не от реального типа объекта.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

01 Jan, 16:16


– Помощь с pet-проектом
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством

Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.

🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

C# | Вопросы собесов

01 Jan, 16:10


🤔 Зачем сделали ref и out для ссылочных типов?

1. ref: позволяет передавать ссылочный тип по ссылке, чтобы изменения в методе влияли на оригинальный объект.
o Это нужно, когда требуется изменить ссылку (например, перенаправить на новый объект) внутри метода.
2. out: используется для передачи данных из метода наружу, не требуя их предварительной инициализации.
o Это упрощает возврат нескольких значений из метода через параметры, особенно для ссылочных типов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

01 Jan, 09:10


🤔 Как часто используешь наследование?

Наследование в объектно-ориентированном программировании, является мощным инструментом для создания иерархий классов и повторного использования кода. Однако его использование должно быть осознанным и оправданным.

🚩Основные сценарии использования

🟠Обобщение и специализация
Наследование используется для создания обобщенных базовых классов и специализированных производных классов.
   public class Animal
{
public void Eat() { /*...*/ }
}

public class Dog : Animal
{
public void Bark() { /*...*/ }
}


🟠Повторное использование кода
Наследование позволяет повторно использовать код базового класса в производных классах, избегая дублирования.
public class Vehicle
{
public int Speed { get; set; }
public void Move() { /*...*/ }
}

public class Car : Vehicle
{
public void Honk() { /*...*/ }
}


🟠Полиморфизм
Наследование позволяет использовать объекты производных классов через ссылки на базовые классы, обеспечивая гибкость и расширяемость кода.
public class Shape
{
public virtual void Draw() { /*...*/ }
}

public class Circle : Shape
{
public override void Draw() { /*...*/ }
}

public void DrawShape(Shape shape)
{
shape.Draw();
}


🚩Рекомендации по использованию

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

🟠Отдавайте предпочтение интерфейсам и абстрактным классам
Интерфейсы и абстрактные классы могут обеспечить большую гибкость и возможность для реализации различных вариантов поведения.
public interface IFlyable
{
void Fly();
}

public class Bird : IFlyable
{
public void Fly() { /*...*/ }
}


🟠Используйте композицию вместо наследования
Композиция может быть предпочтительнее наследования, так как позволяет более гибко комбинировать функциональности.
public class Engine
{
public void Start() { /*...*/ }
}

public class Car
{
private Engine _engine = new Engine();
public void Start() { _engine.Start(); }
}


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

На практике наследование может использоваться реже, чем композиция, особенно в современных подходах к проектированию, таких как микросервисы или системы, ориентированные на интерфейсы. Тем не менее, оно остается важным инструментом, особенно когда необходимо обеспечить полиморфизм или когда существуют естественные иерархии объектов.

🚩Примеры, где наследование оправдано

🟠Создание библиотек и фреймворков
Наследование широко используется в библиотеках и фреймворках для предоставления базовых классов, от которых пользователи могут наследовать свои классы.
public abstract class ControllerBase
{
public abstract void Execute();
}

public class HomeController : ControllerBase
{
public override void Execute() { /*...*/ }
}


🟠Моделирование реальных сущностей
Наследование полезно при моделировании реальных объектов и их иерархий.
public class Employee
{
public string Name { get; set; }
public decimal Salary { get; set; }
}

public class Manager : Employee
{
public int NumberOfSubordinates { get; set; }
}


Ставь
👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

31 Dec, 16:10


🤔 Что такое Garbage Collector?

Это механизм автоматического управления памятью в языках программирования (например, Java, C#), который освобождает память, занятую объектами, больше не используемыми программой.
1. Как работает: GC отслеживает объекты, на которые есть активные ссылки, и удаляет те, которые недоступны.
2. Цель: предотвращение утечек памяти и избавление разработчика от необходимости вручную освобождать память.
3. GC работает асинхронно и может вызывать паузы в работе приложения, известные как "stop-the-world".

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

31 Dec, 09:10


🤔 В чем отличается один к одному от many to many?

Связь "один к одному" (one-to-one) и связь "многие ко многим" (many-to-many) представляют разные типы логических отношений между записями в реляционных базах данных. Основные отличия между этими двумя типами связей заключаются в их природе, реализации и сценариях использования.

🟠Связь "Один к одному" (One-to-One)
Каждая запись в одной таблице соответствует ровно одной записи в другой таблице. Используется для разделения информации на связанные, но отдельные части, например, для повышения безопасности или упрощения структуры данных. Можно использовать уникальный внешний ключ или один и тот же первичный ключ в обеих таблицах.
Пользователи и их профили.
Клиенты и их учетные данные.
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName VARCHAR(100)
);

CREATE TABLE Profiles (
ProfileId INT PRIMARY KEY,
UserId INT UNIQUE,
ProfileData VARCHAR(255),
FOREIGN KEY (UserId) REFERENCES Users(UserId)
);


🟠Связь "Многие ко многим" (Many-to-Many)
Каждая запись в одной таблице может соответствовать множеству записей в другой таблице, и наоборот. Используется для представления сложных взаимосвязей, таких как студенты и курсы, где каждый студент может записаться на множество курсов, и каждый курс может включать множество студентов. Требуется промежуточная (связующая) таблица, содержащая два внешних ключа, ссылающихся на связанные таблицы. Студенты и курсы. Авторы и книги. Таблицы Students и Courses с промежуточной таблицей StudentCourses.
CREATE TABLE Students (
StudentId INT PRIMARY KEY,
StudentName VARCHAR(100)
);

CREATE TABLE Courses (
CourseId INT PRIMARY KEY,
CourseName VARCHAR(100)
);

CREATE TABLE StudentCourses (
StudentId INT,
CourseId INT,
PRIMARY KEY (StudentId, CourseId),
FOREIGN KEY (StudentId) REFERENCES Students(StudentId),
FOREIGN KEY (CourseId) REFERENCES Courses(CourseId)
);


🚩Сравнение

🟠Один к одному
Каждая запись в одной таблице соответствует ровно одной записи в другой таблице.
🟠Многие ко многим
Каждая запись в одной таблице может соответствовать множеству записей в другой таблице и наоборот.

🚩Реализация

🟠Один к одному
Используется уникальный внешний ключ или одинаковый первичный ключ в обеих таблицах.
🟠Многие ко многим
Требуется промежуточная таблица для хранения связей между записями.

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

🟠Один к одному
Пользователь и его профиль, клиент и его учетные данные.
🟠Многие ко многим
Студенты и курсы, авторы и книги.

🚩Примеры запросов

🟠Один к одному
Получение данных пользователя и его профиля
SELECT Users.UserName, Profiles.ProfileData
FROM Users
JOIN Profiles ON Users.UserId = Profiles.UserId;


🟠Многие ко многим
Получение всех курсов, на которые записан студент
SELECT Students.StudentName, Courses.CourseName
FROM Students
JOIN StudentCourses ON Students.StudentId = StudentCourses.StudentId
JOIN Courses ON StudentCourses.CourseId = Courses.CourseId;


Получение всех студентов, записанных на определенный курс
SELECT Courses.CourseName, Students.StudentName
FROM Courses
JOIN StudentCourses ON Courses.CourseId = StudentCourses.CourseId
JOIN Students ON StudentCourses.StudentId = Students.StudentId;


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

30 Dec, 16:10


🤔 Что такое контекст синхронизации?

Контекст синхронизации обеспечивает выполнение кода в правильном потоке, например, в UI-потоке. Это особенно важно для многопоточных приложений, чтобы избежать доступа к объектам из неправильного потока.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

30 Dec, 09:10


🤔 Как реализовать many to many?

Для реализации связи "многие ко многим" (many-to-many) в реляционных базах данных используется промежуточная (связующая) таблица, которая содержит внешние ключи, ссылающиеся на обе связанные таблицы. Эта промежуточная таблица позволяет управлять отношениями между записями двух таблиц.

🚩Пример базы данных

Предположим, у нас есть две таблицы: Students (студенты) и Courses (курсы). Один студент может быть записан на несколько курсов, и один курс может включать нескольких студентов.

🚩Шаги

1⃣Создание основных таблиц
Таблица Students для хранения данных о студентах. Таблица Courses для хранения данных о курсах.

2⃣Создание промежуточной таблицы
Таблица StudentCourses, которая содержит внешние ключи, ссылающиеся на Students и Courses.

🚩Реализация

1⃣Создание таблицы Students
CREATE TABLE Students (
StudentId INT PRIMARY KEY,
StudentName VARCHAR(100)
);


2⃣Создание таблицы Courses
CREATE TABLE Courses (
CourseId INT PRIMARY KEY,
CourseName VARCHAR(100)
);


3⃣Создание промежуточной таблицы StudentCourses
CREATE TABLE StudentCourses (
StudentId INT,
CourseId INT,
PRIMARY KEY (StudentId, CourseId),
FOREIGN KEY (StudentId) REFERENCES Students(StudentId),
FOREIGN KEY (CourseId) REFERENCES Courses(CourseId)
);


🚩Вставка данных

Вставка данных в таблицу Students:
INSERT INTO Students (StudentId, StudentName) VALUES (1, 'John Doe');
INSERT INTO Students (StudentId, StudentName) VALUES (2, 'Jane Smith');


Вставка данных в таблицу Courses
INSERT INTO Courses (CourseId, CourseName) VALUES (1, 'Mathematics');
INSERT INTO Courses (CourseId, CourseName) VALUES (2, 'Science');


Вставка данных в таблицу StudentCourses (связывающая таблица):
INSERT INTO StudentCourses (StudentId, CourseId) VALUES (1, 1); -- John Doe записан на Mathematics
INSERT INTO StudentCourses (StudentId, CourseId) VALUES (1, 2); -- John Doe записан на Science
INSERT INTO StudentCourses (StudentId, CourseId) VALUES (2, 1); -- Jane Smith записана на Mathematics


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

29 Dec, 16:10


🤔 В чём разница между ReadOnly и Const?

const — это компиляторная константа, значение которой должно быть известно на этапе компиляции.
readonly — это поле, значение которого можно установить только при инициализации или в конструкторе, но оно может быть вычислено во время выполнения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

29 Dec, 09:10


🤔 Как реализовать один ко многим?

Для реализации отношения "один ко многим" (one-to-many) в C# с использованием Entity Framework Core, нужно определить две модели, где одна модель будет содержать коллекцию объектов другой модели.

1⃣Определение моделей
Предположим, у нас есть две модели: Author и Book. Один автор может написать много книг, поэтому у нас будет отношение "один ко многим".
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }

// Связь один ко многим
public ICollection<Book> Books { get; set; }
}

public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public int AuthorId { get; set; }

// Навигационное свойство
public Author Author { get; set; }
}


2⃣Настройка контекста данных
Создаем контекст данных, который наследуется от DbContext.
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
public DbSet<Author> Authors { get; set; }
public DbSet<Book> Books { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("YourConnectionStringHere");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Настройка связи один ко многим
modelBuilder.Entity<Author>()
.HasMany(a => a.Books)
.WithOne(b => b.Author)
.HasForeignKey(b => b.AuthorId);
}
}


3⃣Создание и применение миграций
Для создания и применения миграций выполните следующие команды в консоли диспетчера пакетов или CLI.
Использование Package Manager Console (PMC)
Add-Migration InitialCreate
Update-Database


Использование .NET CLI
dotnet ef migrations add InitialCreate
dotnet ef database update


4⃣Добавление данных
Теперь можно добавить данные в базу данных и протестировать отношение "один ко многим".
public class Program
{
public static void Main()
{
using (var context = new AppDbContext())
{
var author = new Author
{
Name = "George Orwell",
Books = new List<Book>
{
new Book { Title = "1984" },
new Book { Title = "Animal Farm" }
}
};

context.Authors.Add(author);
context.SaveChanges();
}
}
}


5⃣Извлечение данных
Теперь можно извлечь данные и проверить отношение.
using (var context = new AppDbContext())
{
var authors = context.Authors.Include(a => a.Books).ToList();
foreach (var author in authors)
{
Console.WriteLine($"Author: {author.Name}");
foreach (var book in author.Books)
{
Console.WriteLine($" Book: {book.Title}");
}
}
}


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

28 Dec, 16:10


🤔 Какова цель ключевых слов ref и out?

ref передаёт аргумент по ссылке, позволяя изменять значение переменной вне метода, но переменная должна быть инициализирована до передачи.
out также передаёт аргумент по ссылке, но переменная может быть не инициализирована, так как метод обязан присвоить ей значение.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

28 Dec, 09:10


🤔 Как сделать связь один к одному?

В реляционных базах данных связь "один к одному" (one-to-one) подразумевает, что каждая запись в одной таблице соответствует ровно одной записи в другой таблице. Для реализации связи "один к одному" в SQL можно использовать несколько подходов, в зависимости от требований и архитектуры базы данных.

🚩Основные подходы

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

🚩Уникальные внешние ключи

Таблицы
Users (пользователи)
UserId (Primary Key)
UserName
Profiles (профили)
ProfileId (Primary Key)
UserId (Foreign Key, Unique)
ProfileData
Создание таблиц
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName VARCHAR(100)
);

CREATE TABLE Profiles (
ProfileId INT PRIMARY KEY,
UserId INT UNIQUE,
ProfileData VARCHAR(255),
FOREIGN KEY (UserId) REFERENCES Users(UserId)
);


Вставка данных
INSERT INTO Users (UserId, UserName) VALUES (1, 'John Doe');
INSERT INTO Profiles (ProfileId, UserId, ProfileData) VALUES (1, 1, 'Profile data for John Doe');


Запрос данных
SELECT Users.UserName, Profiles.ProfileData
FROM Users
JOIN Profiles ON Users.UserId = Profiles.UserId;


🚩Одинаковые первичные ключи

Таблицы
Users (пользователи)
UserId (Primary Key)
UserName
Profiles (профили)
UserId (Primary Key, Foreign Key)
ProfileData
Создание таблиц
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName VARCHAR(100)
);

CREATE TABLE Profiles (
UserId INT PRIMARY KEY,
ProfileData VARCHAR(255),
FOREIGN KEY (UserId) REFERENCES Users(UserId)
);


Вставка данных
INSERT INTO Users (UserId, UserName) VALUES (1, 'John Doe');
INSERT INTO Profiles (UserId, ProfileData) VALUES (1, 'Profile data for John Doe');


Запрос данных
SELECT Users.UserName, Profiles.ProfileData
FROM Users
JOIN Profiles ON Users.UserId = Profiles.UserId;


🚩Плюсы и минусы

🟠Уникальные внешние ключи
Четкая семантика внешнего ключа.
Легкость добавления дополнительных данных в связанную таблицу.
Необходимо следить за уникальностью внешнего ключа.

🟠Одинаковые первичные ключи
Единый идентификатор для связанных данных.
Простота конструкции при обеспечении связи.
Необходимость синхронизации идентификаторов в обеих таблицах.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

27 Dec, 16:10


🤔 Что такое Generic-и?

Это механизм, позволяющий создавать классы, методы и структуры с параметрами типа. Он повышает производительность и безопасность типов, избегая преобразований в object. Например, List<T> может хранить элементы любого типа T, обеспечивая строгую типизацию.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

27 Dec, 09:10


🤔 Какие виды связей бывают у join`ов?

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

🟠INNER JOIN
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах. Это наиболее распространенный тип соединения.
SELECT employees.name, departments.name AS department
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;


🟠LEFT JOIN (или LEFT OUTER JOIN)
LEFT JOIN возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадающих строк нет, то правые столбцы будут заполнены NULL.
SELECT employees.name, departments.name AS department
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
RIGHT JOIN возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадающих строк нет, то левые столбцы будут заполнены NULL.
SELECT employees.name, departments.name AS department
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;


🟠FULL JOIN (или FULL OUTER JOIN)
FULL JOIN возвращает все строки, когда есть совпадение в левой или правой таблице. Если совпадающих строк нет, то в соответствующих столбцах будут NULL.
SELECT employees.name, departments.name AS department
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;


🟠CROSS JOIN
CROSS JOIN возвращает декартово произведение двух таблиц, то есть каждая строка из первой таблицы соединяется с каждой строкой из второй таблицы.
SELECT employees.name, departments.name AS department
FROM employees
CROSS JOIN departments;


🟠SELF JOIN
SELF JOIN используется для соединения таблицы с самой собой. Это полезно для работы с иерархическими данными или для сравнения строк в одной таблице.
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;


🟠NATURAL JOIN
NATURAL JOIN автоматически соединяет таблицы по всем столбцам с одинаковыми именами и совместимыми типами данных. Обычно используется редко из-за потенциальных проблем с неявным сопоставлением столбцов.
SELECT employees.name, departments.name AS department
FROM employees
NATURAL JOIN departments;


🚩Виды логических связей между таблицами

🟠Один ко многим (One-to-Many)
Пример: Один департамент имеет много сотрудников. Соединение: INNER JOIN, LEFT JOIN, RIGHT JOIN.

🟠Многие ко многим (Many-to-Many)
Пример: Студенты записаны на несколько курсов, а каждый курс может включать многих студентов. Соединение: Потребуется промежуточная таблица для реализации соединения.

🟠Один к одному (One-to-One)
Пример: Каждому сотруднику соответствует одна учетная запись в системе. Соединение: INNER JOIN, LEFT JOIN.

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

26 Dec, 16:10


🤔 Что такое Join-ы?

Это операции, которые объединяют строки из двух или более таблиц на основе логического условия. Основные типы:
1. INNER JOIN: возвращает строки, где есть совпадения в обеих таблицах.
2. LEFT JOIN: возвращает все строки из левой таблицы и совпадающие строки из правой, остальные заполняются NULL.
3. RIGHT JOIN: аналогично LEFT JOIN, но с правой таблицей.
4. FULL OUTER JOIN: объединяет все строки из обеих таблиц, заполняя несоответствия NULL.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

26 Dec, 09:10


🤔 Какие типы связей знаешь у join`ов?

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

🟠INNER JOIN
INNER JOIN возвращает только те строки, которые имеют совпадающие значения в обеих таблицах. Это наиболее часто используемый тип соединения.
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;


🟠LEFT JOIN (или LEFT OUTER JOIN)
LEFT JOIN возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, результат содержит NULL для столбцов из правой таблицы.
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
RIGHT JOIN возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, результат содержит NULL для столбцов из левой таблицы.
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;


🟠FULL JOIN (или FULL OUTER JOIN)
FULL JOIN возвращает все строки, когда есть совпадение в левой или правой таблице. Если совпадений нет, результат содержит NULL для столбцов из таблицы, где нет совпадений.
SELECT employees.name, departments.name
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;


🟠CROSS JOIN
CROSS JOIN возвращает декартово произведение двух таблиц, то есть каждая строка из первой таблицы соединяется с каждой строкой из второй таблицы.
SELECT employees.name, departments.name
FROM employees
CROSS JOIN departments;


🟠SELF JOIN
SELF JOIN используется для соединения таблицы с самой собой. Это полезно для работы с иерархическими данными или когда требуется сравнить строки в одной таблице.
SELECT e1.name AS Employee1, e2.name AS Employee2
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;


🚩Пример базы данных

🟠Таблицы
employees
id
name
department_id
manager_id
departments
id
name

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

🟠INNER JOIN
Вернет только тех сотрудников, которые имеют департамент.
SELECT employees.name, departments.name AS department
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;


🟠LEFT JOIN
Вернет всех сотрудников, включая тех, у которых нет департамента.
SELECT employees.name, departments.name AS department
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;


🟠RIGHT JOIN
Вернет все департаменты, включая те, в которых нет сотрудников.
SELECT employees.name, departments.name AS department
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;


🟠FULL JOIN
Вернет всех сотрудников и все департаменты, включая те, у которых нет совпадений.
SELECT employees.name, departments.name AS department
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;


🟠CROSS JOIN
Вернет каждую комбинацию сотрудников и департаментов.
SELECT employees.name, departments.name AS department
FROM employees
CROSS JOIN departments;


🟠SELF JOIN
Вернет всех сотрудников и их менеджеров.
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

25 Dec, 09:10


🤔 Что такое В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;   


🚩Плюсы

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

🚩Минусы

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

Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

24 Dec, 16:10


🤔 Какие механизмы позволяют не нарушать принцип dependency inversion?

Для соблюдения принципа dependency inversion используются интерфейсы и абстракции, которые позволяют код зависеть от общего поведения, а не от конкретных реализаций. Также помогают фабрики (Factories) для создания объектов и DI-контейнеры (Dependency Injection), которые управляют зависимостями и их внедрением.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний

C# | Вопросы собесов

24 Dec, 09:10


🤔 Какие минусы есть у индексов с точки зрения оптимизации?

Индексы в базах данных, таких как SQL Server, MySQL или PostgreSQL, существенно улучшают производительность запросов, особенно для операций поиска, сортировки и фильтрации. Однако у индексов есть и минусы, которые могут негативно сказаться на производительности и других аспектах работы базы данных.

🟠Увеличение времени записи
Индексы замедляют операции вставки (INSERT), обновления (UPDATE) и удаления (DELETE), так как при каждом изменении данных необходимо также обновлять индексы.
Вставка: При вставке новой записи нужно обновить все соответствующие индексы.
Обновление: При обновлении записи могут изменяться индексируемые колонки, что требует обновления индексов.
Удаление: При удалении записи нужно удалить соответствующие записи из индексов.

🟠Дополнительное использование памяти и дискового пространства
Индексы занимают дополнительное пространство на диске и в оперативной памяти. Чем больше индексов на таблице, тем больше требуется места для их хранения.
Дисковое пространство: Каждому индексу требуется место на диске для хранения его данных.
Память: Индексы занимают память при их использовании, особенно в случае часто запрашиваемых индексов, которые кэшируются в оперативной памяти.

🟠Замедление операций массовой загрузки данных
При массовой загрузке данных, например, при использовании операций LOAD DATA или BULK INSERT, наличие индексов замедляет процесс, так как индексы должны обновляться по мере добавления каждой записи.

🟠Проблемы с фрагментацией
Индексы могут фрагментироваться, особенно если в таблице часто выполняются операции вставки, обновления и удаления. Фрагментация индексов приводит к ухудшению производительности запросов.
Фрагментация: При частых изменениях данных индексы могут становиться фрагментированными, что увеличивает время доступа к данным.
Реорганизация: Периодически индексы нужно реорганизовывать или перестраивать, что требует дополнительных ресурсов и времени.

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

🟠Перекрестные индексы
Наличие нескольких индексов на одной таблице может привести к конфликтам при планировании запросов. Оптимизатор запросов может выбирать менее эффективные индексы, что ухудшает производительность.

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

🚩Пример ситуации

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

CREATE INDEX idx_firstname ON Employees(FirstName);
CREATE INDEX idx_lastname ON Employees(LastName);
CREATE INDEX idx_department ON Employees(DepartmentID);


🚩Минусы

Вставка данных
INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES (1, 'John', 'Doe', 10, 60000.00);


Обновление данных
UPDATE Employees
SET Salary = Salary * 1.05
WHERE DepartmentID = 10;


Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов

23 Dec, 16:10


🤔 В чем отличие Dispose и Finalize?

Dispose освобождает неуправляемые ресурсы явно, обычно через реализацию интерфейса IDisposable. Finalize вызывается сборщиком мусора автоматически для очистки перед удалением объекта, но менее предсказуем. Для надёжного освобождения ресурсов рекомендуется использовать Dispose.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний