C# | Вопросы собесов
5.1K subscribers
35 photos
1 file
983 links
Download Telegram
🤔 Какова концепция сборки мусора?

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


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


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

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


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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Какие есть принципы 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).


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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какие минусы у микросервисов?

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

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


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

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

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

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

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

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


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


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

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


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


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

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


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

Запрос к базе данных отправляется в момент выполнения операций, которые требуют взаимодействия с базой данных. В контексте использования 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(); // Запрос к базе данных отправляется здесь
}


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

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


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

Это механизм, который позволяет объектам уведомлять другие объекты о том, что произошло определенное действие. Это важная часть паттерна "наблюдатель" (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();
}
}


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

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


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