C# | Вопросы собесов
5.1K subscribers
35 photos
1 file
985 links
Download Telegram
🤔 Какой из следующих методов C# используется для явного указания, что объект должен быть собран сборщиком мусора?
Anonymous Quiz
64%
Dispose()
12%
SuppressFinalize()
22%
Collect()
2%
Abort()
👾1
📌 Что такое принцип подстановки Барбары Лисков?

💬 Спрашивают в 22% собеседований

Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) - это один из пяти принципов SOLID, который гласит, что объекты подтипов должны быть заменяемы объектами базового типа без нарушения правильности работы программы. Это означает, что если класс B является подтипом класса A, то объекты класса A могут быть заменены объектами класса B без изменения желаемого поведения программы.

🤔 Основные понятия

1️⃣ Наследование: Подтипы должны наследовать не только интерфейс, но и поведение базовых типов.

2️⃣ Замена: Класс-наследник должен корректно работать в любом контексте, где ожидается объект базового класса.

3️⃣ Контракт: Подтип должен соблюдать контракт базового типа, что включает предусловия, постусловия и инварианты.

🤔 Почему это нужно

Упрощение понимания и поддержки кода: Код, который следует LSP, более предсказуем и понятен, что облегчает его поддержку.

Повышение надежности: Соблюдение принципа помогает избежать неожиданных ошибок при замене объектов базового класса на объекты подклассов.

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

🤔 Пример нарушения LSP

Рассмотрим пример, где нарушение LSP приводит к некорректному поведению программы:
public class Rectangle
{
public virtual int Width { get; set; }
public virtual int Height { get; set; }

public int GetArea()
{
return Width * Height;
}
}

public class Square : Rectangle
{
public override int Width
{
set { base.Width = base.Height = value; }
}

public override int Height
{
set { base.Width = base.Height = value; }
}
}


🤔 Проблема

В этом примере Square (квадрат) наследует от Rectangle (прямоугольник). Однако, квадрат имеет особое свойство: его ширина и высота всегда равны. При попытке установить ширину или высоту квадрата, изменяется и другое значение, что нарушает поведение прямоугольника.

🤔 Исправление

Лучше использовать композицию вместо наследования для избежания такой проблемы:
public interface IShape
{
int GetArea();
}

public class Rectangle : IShape
{
public int Width { get; set; }
public int Height { get; set; }

public int GetArea()
{
return Width * Height;
}
}

public class Square : IShape
{
public int SideLength { get; set; }

public int GetArea()
{
return SideLength * SideLength;
}
}


🤔 Объяснение

1️⃣ Интерфейс IShape: Определяем общий интерфейс для всех форм.

2️⃣ Реализация прямоугольника и квадрата: Классы Rectangle и Square реализуют интерфейс IShape, но теперь они не наследуются друг от друга и имеют свои собственные свойства и методы.

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
🤔 Какое ключевое слово в C# используется для создания метода, который может быть переопределён в производном классе?
Anonymous Quiz
73%
virtual
14%
abstract
12%
override
1%
sealed
📌 Какие колекции знаешь?

💬 Спрашивают в 22% собеседований

В C# существует множество коллекций, которые предоставляются в стандартной библиотеке .NET. Они делятся на несколько категорий, каждая из которых предназначена для различных сценариев использования. Вот основные типы коллекций:

1️⃣ Коллекции общего назначения

List<T>: Динамический массив, который автоматически изменяет свой размер по мере добавления элементов.
  List<int> numbers = new List<int> { 1, 2, 3, 4 };
numbers.Add(5);


Dictionary<TKey, TValue>: Коллекция пар ключ-значение. Обеспечивает быстрый доступ к значению по ключу.
  Dictionary<string, int> ages = new Dictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};
int aliceAge = ages["Alice"];


HashSet<T>: Коллекция уникальных элементов. Используется для проверки наличия элемента и предотвращения дублирования.
  HashSet<string> fruits = new HashSet<string> { "Apple", "Banana" };
fruits.Add("Apple"); // Не добавит дубликат


Queue<T>: Очередь, работающая по принципу FIFO (First In, First Out).
  Queue<string> queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
string item = queue.Dequeue(); // "first"


Stack<T>: Стек, работающий по принципу LIFO (Last In, First Out).
  Stack<string> stack = new Stack<string>();
stack.Push("first");
stack.Push("second");
string item = stack.Pop(); // "second"


2️⃣ Специализированные коллекции

LinkedList<T>: Двусвязный список, позволяющий быстро вставлять и удалять элементы.
  LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1);
linkedList.AddLast(2);


SortedList<TKey, TValue>: Коллекция пар ключ-значение, отсортированная по ключам.
  SortedList<string, int> sortedList = new SortedList<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};


SortedDictionary<TKey, TValue>: Похож на SortedList, но использует бинарное дерево для хранения элементов.
  SortedDictionary<string, int> sortedDict = new SortedDictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};


SortedSet<T>: Отсортированное множество уникальных элементов.
  SortedSet<int> sortedSet = new SortedSet<int> { 3, 1, 2 };


3️⃣ Коллекции для параллельного программирования

ConcurrentDictionary<TKey, TValue>: Параллельная версия Dictionary, предназначенная для безопасного использования в многопоточных приложениях.
  ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict.TryAdd("Alice", 30);


ConcurrentQueue<T>: Параллельная версия Queue.
  ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();
concurrentQueue.Enqueue("first");


ConcurrentStack<T>: Параллельная версия Stack.
  ConcurrentStack<string> concurrentStack = new ConcurrentStack<string>();
concurrentStack.Push("first");


BlockingCollection<T>: Коллекция, поддерживающая операции добавления и извлечения с блокировкой и ограничением по емкости.
  BlockingCollection<int> blockingCollection = new BlockingCollection<int>(5);
blockingCollection.Add(1);


🤔 Краткий ответ

В C# есть множество коллекций для различных целей, включая List, Dictionary, HashSet, Queue, Stack, специализированные коллекции, такие как LinkedList, SortedList, а также коллекции для параллельного программирования, такие как ConcurrentDictionary и BlockingCollection.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
📌 Что такое DI(инъекция зависимости)?

💬 Спрашивают в 22% собеседований

Dependency Injection (DI), или инъекция зависимости, — это шаблон проектирования, который позволяет объектам получить свои зависимости от внешних источников, а не создавать их самостоятельно. Этот подход улучшает тестируемость, расширяемость и поддерживаемость кода, делая его более гибким и модульным.

🤔 Основные концепции

1️⃣ Зависимость: Любой объект или класс, от которого зависит другой объект или класс. Например, если класс A использует класс B для выполнения своих задач, то B является зависимостью для A.

2️⃣ Инъекция зависимости: Процесс предоставления зависимости объекту извне, обычно через конструктор, метод или свойство.

🤔 Преимущества DI

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

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

Расширяемость и поддерживаемость: Позволяет легко добавлять новые функциональные возможности и изменять существующие зависимости.

🤔 Виды инъекций зависимости

1️⃣ Конструкторная инъекция: Зависимости передаются через параметры конструктора.
   public class Service
{
private readonly IRepository _repository;

public Service(IRepository repository)
{
_repository = repository;
}

public void DoWork()
{
_repository.Save();
}
}


2️⃣ Инъекция через свойства: Зависимости устанавливаются через свойства класса.
   public class Service
{
public IRepository Repository { get; set; }

public void DoWork()
{
Repository.Save();
}
}


3️⃣ Инъекция через методы: Зависимости передаются через параметры метода.
   public class Service
{
private IRepository _repository;

public void SetRepository(IRepository repository)
{
_repository = repository;
}

public void DoWork()
{
_repository.Save();
}
}


🤔 Использование DI с IoC-контейнерами

IoC-контейнеры (контейнеры инверсии управления) управляют созданием и жизненным циклом зависимостей, а также автоматизируют процесс их инъекции. Пример использования популярного IoC-контейнера Autofac:

1️⃣ Установка Autofac: Добавляем пакет Autofac через NuGet Package Manager.

2️⃣ Настройка контейнера и регистрация зависимостей:
   using Autofac;

var builder = new ContainerBuilder();
builder.RegisterType<Repository>().As<IRepository>();
builder.RegisterType<Service>().As<IService>();
var container = builder.Build();


3️⃣ Разрешение зависимостей и использование сервиса:
   using (var scope = container.BeginLifetimeScope())
{
var service = scope.Resolve<IService>();
service.DoWork();
}


🤔 Краткий ответ

Dependency Injection (DI) — это метод предоставления зависимостей объекту извне, что делает код более гибким, тестируемым и поддерживаемым. DI может осуществляться через конструкторы, свойства или методы, а IoC-контейнеры автоматизируют процесс управления зависимостями.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какой модификатор доступа в C# используется для обеспечения доступа к члену класса только внутри его текущего сборочного контекста?
Anonymous Quiz
18%
private
9%
protected
61%
internal
13%
protected internal
📌 В чем разница между списком и массивом?

💬 Спрашивают в 22% собеседований

В C# списки (List) и массивы (Array) являются двумя основными типами коллекций, но они имеют различия в своих свойствах, возможностях и сценариях использования. Рассмотрим основные различия между ними.

🤔 Массивы (Array)

1️⃣ Размер: Массивы имеют фиксированный размер, который необходимо указать при создании. Размер массива не может быть изменен после его создания.
   int[] numbers = new int[5]; // Массив из 5 элементов


2️⃣ Тип данных: Массивы являются типобезопасными, что означает, что все элементы массива должны быть одного типа.
   string[] words = new string[] { "apple", "banana", "cherry" };


3️⃣ Быстродействие: Массивы обеспечивают очень быстрый доступ к элементам по индексу, так как они хранятся в непрерывном блоке памяти.
   int firstNumber = numbers[0]; // Быстрый доступ по индексу


4️⃣ Методы и свойства: Массивы имеют ограниченный набор методов и свойств. В основном это методы для работы с элементами, такие как Length.
   int length = numbers.Length; // Длина массива


🤔 Списки (List)

1️⃣ Размер: Списки имеют динамический размер, который автоматически изменяется по мере добавления или удаления элементов.
   List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
numbersList.Add(6); // Добавление элемента увеличивает размер списка


2️⃣ Тип данных: Списки также являются типобезопасными и могут хранить элементы только одного типа.
   List<string> wordsList = new List<string> { "apple", "banana", "cherry" };


3️⃣ Быстродействие: Доступ к элементам списка по индексу также быстрый, но из-за динамической природы список может быть менее эффективен по памяти при частом изменении размера.
   int firstNumberInList = numbersList[0]; // Быстрый доступ по индексу


4️⃣ Методы и свойства: Списки обладают богатым набором методов и свойств, таких как Add, Remove, Find, Count и многие другие, что делает их более удобными для работы с динамическими данными.
   int count = numbersList.Count; // Количество элементов в списке
numbersList.Remove(3); // Удаление элемента


🤔 Основные различия

1️⃣ Размер: Массивы фиксированного размера, списки динамического размера.

2️⃣ Гибкость: Списки более гибкие и предоставляют больше методов для работы с элементами.

3️⃣ Производительность: Массивы могут быть более эффективны по памяти и быстрее при доступе к элементам, но менее гибкие в изменении размера.

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

Массив:
int[] numbersArray = new int[] { 1, 2, 3, 4, 5 };
int firstElement = numbersArray[0];
numbersArray[2] = 10;
Console.WriteLine(numbersArray.Length);


Список:
List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
numbersList.Add(6);
int firstElementInList = numbersList[0];
numbersList[2] = 10;
Console.WriteLine(numbersList.Count);
numbersList.Remove(4);


🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Какое из следующих ключевых слов в C# используется для объявления метода, который не имеет реализации в базовом классе и должен быть переопределён в производных классах?
Anonymous Quiz
22%
virtual
73%
abstract
4%
sealed
1%
static
👍1
📌 Что такое post?

💬 Спрашивают в 22% собеседований

В C# post чаще всего ассоциируется с HTTP POST-запросами, которые используются для отправки данных на сервер. Это один из основных методов HTTP-протокола наряду с GET, PUT, DELETE и другими.

🤔 Основные понятия

1️⃣ HTTP POST-запрос: Метод HTTP, используемый для отправки данных на сервер. Обычно применяется для создания новых ресурсов или передачи данных, которые могут изменять состояние сервера.

2️⃣ Отправка данных: Данные могут быть отправлены в теле запроса в различных форматах, таких как JSON, XML или обычный текст.

3️⃣ Использование в веб-приложениях: POST-запросы широко используются в веб-приложениях для передачи данных от клиента к серверу, например, при отправке формы, загрузке файлов или выполнении AJAX-запросов.

🤔 Пример использования HTTP POST-запроса в C#

Для выполнения HTTP POST-запроса в C# часто используется класс HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.

🤔 Пример отправки JSON-данных

1️⃣ Настройка проекта: Убедитесь, что в вашем проекте установлен пакет System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).

2️⃣ Отправка POST-запроса:
   using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource";

// Данные для отправки
var data = new
{
Name = "John Doe",
Age = 30
};

// Сериализуем данные в JSON
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);

// Создаем содержимое запроса
StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");

// Отправляем POST-запрос
HttpResponseMessage response = await client.PostAsync(url, content);

// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Запрос выполнен успешно.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}


🤔 Объяснение кода

1️⃣ Создание HttpClient: Объект HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.

2️⃣ Определение URL: URL-адрес, на который будет отправлен POST-запрос.

3️⃣ Создание данных: Объект с данными, которые мы хотим отправить на сервер. В данном случае это анонимный объект с именем и возрастом.

4️⃣ Сериализация данных: Преобразование объекта в JSON-строку с использованием JsonConvert.SerializeObject.

5️⃣ Создание содержимого запроса: Объект StringContent, который содержит сериализованные данные, кодировку и тип содержимого.

6️⃣ Отправка POST-запроса: Метод PostAsync отправляет POST-запрос на указанный URL с указанным содержимым.

7️⃣ Проверка ответа: Проверка успешности ответа с использованием свойства IsSuccessStatusCode.

🤔 Краткий ответ

HTTP POST-запрос используется для отправки данных на сервер, обычно для создания новых ресурсов. В C# для выполнения POST-запросов часто используется класс HttpClient, который позволяет отправлять данные в формате JSON или других форматах.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Что такое put?

💬 Спрашивают в 22% собеседований

В C# и веб-программировании PUT обычно относится к HTTP PUT-запросам, которые используются для обновления ресурсов на сервере. Это один из основных методов HTTP-протокола наряду с GET, POST, DELETE и другими.

🤔 Основные понятия

1️⃣ HTTP PUT-запрос: Метод HTTP, который используется для обновления существующего ресурса или создания ресурса, если он не существует. В отличие от POST, который обычно используется для создания новых ресурсов, PUT применяется для замены текущего состояния ресурса новым состоянием.

2️⃣ Идемпотентность: PUT-запросы идемпотентны, что означает, что многократное выполнение одного и того же запроса с одинаковыми данными приведет к одному и тому же результату. Это важно для надежности сетевых операций.

3️⃣ Отправка данных: Как и в случае с POST-запросами, данные могут быть отправлены в теле запроса в различных форматах, таких как JSON, XML или обычный текст.

🤔 Пример использования HTTP PUT-запроса в C#

Для выполнения HTTP PUT-запроса в C# часто используется класс HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.

🤔 Пример обновления ресурса с помощью PUT-запроса

1️⃣ Настройка проекта: Убедитесь, что в вашем проекте установлен пакет System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).

2️⃣ Отправка PUT-запроса:
   using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource/1"; // Предполагается, что ресурс с ID 1 уже существует

// Данные для отправки
var data = new
{
Name = "John Doe",
Age = 31 // Обновляем возраст
};

// Сериализуем данные в JSON
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);

// Создаем содержимое запроса
StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");

// Отправляем PUT-запрос
HttpResponseMessage response = await client.PutAsync(url, content);

// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Ресурс успешно обновлен.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}


🤔 Объяснение кода

1️⃣ Создание HttpClient: Объект HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.

2️⃣ Определение URL: URL-адрес, на который будет отправлен PUT-запрос. В данном случае предполагается, что ресурс с ID 1 уже существует.

3️⃣ Создание данных: Объект с данными, которые мы хотим отправить на сервер для обновления ресурса. В данном случае это анонимный объект с обновленным именем и возрастом.

4️⃣ Сериализация данных: Преобразование объекта в JSON-строку с использованием JsonConvert.SerializeObject.

5️⃣ Создание содержимого запроса: Объект StringContent, который содержит сериализованные данные, кодировку и тип содержимого.

6️⃣ Отправка PUT-запроса: Метод PutAsync отправляет PUT-запрос на указанный URL с указанным содержимым.

🤔 Краткий ответ

HTTP PUT-запрос используется для обновления существующего ресурса или создания ресурса, если он не существует. В C# для выполнения PUT-запросов часто используется класс HttpClient, который позволяет отправлять данные в формате JSON или других форматах. PUT-запросы идемпотентны, что означает, что многократное выполнение одного и того же запроса приведет к одному и тому же результату.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Какой из следующих делегатов в C# может ссылаться на метод, возвращающий значение и принимающий один параметр?
Anonymous Quiz
26%
Func<int>
16%
Action<int>
10%
Predicate<int>
48%
Func<int, string>
📌 Что такое delete?

💬 Спрашивают в 11% собеседований

В C# и веб-программировании DELETE обычно относится к HTTP DELETE-запросам, которые используются для удаления ресурсов на сервере. Это один из основных методов HTTP-протокола наряду с GET, POST, PUT и другими.

🤔 Основные понятия

1️⃣ HTTP DELETE-запрос: Метод HTTP, который используется для удаления ресурса, определенного по URI. Если запрос успешен, ресурс будет удален с сервера.

2️⃣ Идемпотентность: DELETE-запросы также идемпотентны, что означает, что многократное выполнение одного и того же запроса приведет к одному и тому же результату — ресурс будет удален, и последующие DELETE-запросы к тому же ресурсу не изменят состояние сервера.

3️⃣ Без тела запроса: Обычно DELETE-запросы не содержат тела запроса, но это зависит от специфики API. Некоторые API могут требовать подтверждения или дополнительные данные в теле запроса.

🤔 Пример использования HTTP DELETE-запроса в C#

Для выполнения HTTP DELETE-запроса в C# часто используется класс HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.

🤔 Пример удаления ресурса с помощью DELETE-запроса

1️⃣ Настройка проекта: Убедитесь, что в вашем проекте установлен пакет System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).

2️⃣ Отправка DELETE-запроса:
   using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource/1"; // Предполагается, что ресурс с ID 1 существует

// Отправляем DELETE-запрос
HttpResponseMessage response = await client.DeleteAsync(url);

// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Ресурс успешно удален.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}


🤔 Объяснение кода

1️⃣ Создание HttpClient: Объект HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.

2️⃣ Определение URL: URL-адрес, на который будет отправлен DELETE-запрос. В данном случае предполагается, что ресурс с ID 1 существует.

3️⃣ Отправка DELETE-запроса: Метод DeleteAsync отправляет DELETE-запрос на указанный URL.

4️⃣ Проверка ответа: Проверка успешности ответа с использованием свойства IsSuccessStatusCode.

🤔 Краткий ответ

HTTP DELETE-запрос используется для удаления ресурса на сервере. В C# для выполнения DELETE-запросов часто используется класс HttpClient, который позволяет отправлять запросы и получать ответы от веб-сервисов. DELETE-запросы идемпотентны, что означает, что многократное выполнение одного и того же запроса приведет к одному и тому же результату — ресурс будет удален.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какое из следующих ключевых слов в C# предотвращает переопределение метода в производных классах?
Anonymous Quiz
68%
sealed
9%
static
10%
override
13%
private
📌 Какие бывают самые популярные коды ошибок в HTTP?

💬 Спрашивают в 11% собеседований

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

🤔 1xx: Информационные

Эти коды состояния сообщают, что запрос был получен и продолжается обработка.

100 Continue: Указывает, что начальная часть запроса была получена и клиент должен продолжать отправку запроса.

101 Switching Protocols: Сервер согласен на переключение протоколов, как запросил клиент.

🤔 2xx: Успешные
Эти коды состояния указывают на успешное выполнение запроса.

200 OK: Запрос выполнен успешно. Ответ зависит от используемого метода HTTP (например, GET вернет запрашиваемый ресурс).

201 Created: Запрос привел к созданию нового ресурса.

204 No Content: Запрос был успешным, но в ответе не содержится контента.

🤔 3xx: Перенаправление

Эти коды состояния указывают, что клиент должен предпринять дополнительные действия для завершения запроса.

301 Moved Permanently: Ресурс был перемещен на постоянный новый URL.

302 Found: Ресурс временно находится по другому URL. Клиент должен использовать исходный URL для будущих запросов.

304 Not Modified: Ресурс не был изменен с момента последнего запроса клиента.

🤔 4xx: Ошибки клиента

Эти коды состояния указывают на ошибки, которые произошли по вине клиента.

400 Bad Request: Сервер не может обработать запрос из-за синтаксической ошибки.

401 Unauthorized: Требуется аутентификация. Клиент должен аутентифицироваться для получения запрашиваемого ресурса.

403 Forbidden: Сервер понял запрос, но отказывается его выполнять.

404 Not Found: Запрашиваемый ресурс не найден на сервере.

405 Method Not Allowed: Метод, указанный в запросе, не поддерживается данным ресурсом.

409 Conflict: Конфликт при обработке запроса, например, при попытке создать дублирующий ресурс.

429 Too Many Requests: Клиент отправил слишком много запросов за короткий промежуток времени.

🤔 5xx: Ошибки сервера

Эти коды состояния указывают на ошибки, произошедшие на сервере.

500 Internal Server Error: Внутренняя ошибка сервера. Запрос не может быть выполнен из-за ошибки на сервере.

501 Not Implemented: Сервер не поддерживает функциональность, необходимую для выполнения запроса.

502 Bad Gateway: Сервер, действующий как шлюз или прокси, получил недействительный ответ от вышестоящего сервера.

503 Service Unavailable: Сервер временно не доступен, обычно из-за перегрузки или технического обслуживания.

504 Gateway Timeout: Сервер, действующий как шлюз или прокси, не получил своевременный ответ от вышестоящего сервера.

🤔 Краткий ответ

Наиболее популярные коды ошибок HTTP включают:

400 Bad Request: Неверный запрос.

401 Unauthorized: Необходима аутентификация.

403 Forbidden: Доступ запрещен.

404 Not Found: Ресурс не найден.

500 Internal Server Error: Внутренняя ошибка сервера.

503 Service Unavailable: Сервер временно не доступен.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой из следующих операторов в C# используется для явного преобразования типа с проверкой на успешность выполнения?
Anonymous Quiz
37%
is
38%
as
16%
cast
10%
typeof
📌 Зачем нужен git?

💬 Спрашивают в 11% собеседований

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

🤔 Основные преимущества использования Git

1️⃣ Отслеживание изменений: Git позволяет отслеживать все изменения, сделанные в коде, кто их сделал и когда. Это важно для понимания истории проекта и для отката к предыдущим версиям, если что-то пошло не так.
   git log


2️⃣ Ветвление и слияние: Git поддерживает мощные возможности ветвления (branching), что позволяет разработчикам работать над разными частями проекта одновременно и независимо друг от друга. Ветви можно легко сливать (merge) обратно, чтобы объединить изменения.
   git branch feature-branch
git checkout feature-branch
git merge main


3️⃣ Сотрудничество: Git позволяет нескольким разработчикам работать над одним и тем же проектом одновременно, не мешая друг другу. Это достигается благодаря распределенной природе Git и возможностям управления конфликтами.
   git clone https://github.com/user/repo.git
git pull origin main
git push origin main


4️⃣ Резервное копирование: Все изменения хранятся локально, и они могут быть легко синхронизированы с удаленным репозиторием (например, на GitHub или GitLab), что создает резервную копию проекта.
   git remote add origin https://github.com/user/repo.git
git push -u origin main


5️⃣ Восстановление и отмена изменений: Git позволяет легко отменить изменения или вернуться к предыдущей версии кода.
   git checkout <commit-hash>
git revert <commit-hash>


🤔 Основные команды Git

1️⃣ Инициализация репозитория:
   git init


2️⃣ Клонирование репозитория:
   git clone https://github.com/user/repo.git


3️⃣ Добавление изменений в индекс (staging area):
   git add .


4️⃣ Создание коммита:
   git commit -m "Сообщение коммита"


5️⃣ Просмотр состояния репозитория:
   git status


6️⃣ Просмотр истории коммитов:
   git log


7️⃣ Создание новой ветки:
   git branch new-branch


8️⃣ Переключение между ветками:
   git checkout new-branch


9️⃣ Слияние веток:
   git merge new-branch


1️⃣0️⃣ Отправка изменений в удаленный репозиторий:
    git push origin main


1️⃣1️⃣ Получение изменений из удаленного репозитория:
    git pull origin main


🤔 Краткий ответ

Git нужен для отслеживания изменений в коде, управления версиями, сотрудничества между разработчиками и обеспечения резервного копирования проектов. Это мощная и гибкая система контроля версий, которая стала стандартом в разработке программного обеспечения.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🤔 Какой из следующих типов в C# является неизменяемым (immutable)?
Anonymous Quiz
14%
StringBuilder
13%
Array
70%
String
3%
List<T>
📌 С точки зрения контроля версий, каким образом обмениваться изменениями в базе данных?

💬 Спрашивают в 11% собеседований

Обмен изменениями в базе данных в контексте контроля версий может быть сложным, поскольку базы данных не являются простыми текстовыми файлами и требуют особого подхода для синхронизации изменений. Вот несколько подходов и инструментов, которые можно использовать для управления версиями базы данных и обмена изменениями:

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

1️⃣ Миграции базы данных:

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

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

Примеры инструментов: Entity Framework Migrations (для .NET), Flyway, Liquibase.
   // Пример миграции с использованием Entity Framework
public partial class AddNewTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "NewTable",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_NewTable", x => x.Id);
});
}

protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "NewTable");
}
}


2️⃣ Скрипты изменений:

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

Использование: Скрипты изменений хранятся в системе контроля версий (например, Git) и применяются разработчиками и администраторами баз данных по мере необходимости.

Примеры: SQL-скрипты для создания таблиц, изменения столбцов, добавления индексов и т.д.
   -- Пример SQL-скрипта для добавления нового столбца в таблицу
ALTER TABLE Users ADD BirthDate DATE;


3️⃣ Инструменты для управления схемами базы данных:

Описание: Существуют специализированные инструменты для управления схемами баз данных, которые позволяют автоматизировать процесс внесения изменений и синхронизации баз данных.

Использование: Эти инструменты интегрируются с системами контроля версий и позволяют создавать, управлять и применять миграции и скрипты изменений.

Примеры инструментов: Redgate SQL Source Control, Liquibase, Flyway.

🤔 Инструменты и практики

1️⃣ Entity Framework Migrations (для .NET):

Описание: Инструмент для управления изменениями схемы базы данных в приложениях на .NET.

Использование:
     dotnet ef migrations add AddNewTable
dotnet ef database update


2️⃣ Flyway:

Описание: Инструмент для управления миграциями баз данных, поддерживающий различные СУБД.

Использование:
     flyway migrate


3️⃣ Liquibase:

Описание: Инструмент для управления изменениями базы данных, поддерживающий различные СУБД и интеграцию с системами контроля версий.

Использование:
     liquibase update


🤔 Краткий ответ

Для обмена изменениями в базе данных используется подход с миграциями, который позволяет управлять изменениями схемы базы данных. Инструменты, такие как Entity Framework Migrations, Flyway и Liquibase, помогают автоматизировать и управлять этим процессом. Миграции и скрипты изменений хранятся в системе контроля версий и применяются последовательно для синхронизации баз данных.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🤔 Какой из следующих методов интерфейса IEnumerable в C# выполняет отложенное выполнение (lazy evaluation)?
Anonymous Quiz
18%
ToList()
22%
FirstOrDefault()
53%
Where()
7%
Count()
📌 Что такое partial классы?

💬 Спрашивают в 11% собеседований

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

🤔 Основные понятия

1️⃣ Разделение определения класса: Класс можно разделить на несколько частей, которые могут находиться в разных файлах. Все части объединяются компилятором в один класс.

2️⃣ Поддержка совместной разработки: Несколько разработчиков могут работать над разными частями одного класса одновременно, не мешая друг другу.

3️⃣ Автоматическая генерация кода: Инструменты, которые генерируют код (например, дизайнеры форм в Visual Studio), могут создавать одну часть класса, оставляя другую часть для ручного редактирования разработчиком.

🤔 Пример использования `partial` классов

🤔 Файл: `Person.Part1.cs`
public partial class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }

public void PrintFullName()
{
Console.WriteLine($"{FirstName} {LastName}");
}
}


🤔 Файл: `Person.Part2.cs`
public partial class Person
{
public int Age { get; set; }

public void PrintAge()
{
Console.WriteLine($"Age: {Age}");
}
}


🤔 Объяснение кода

1️⃣ Определение класса: Класс Person определен в двух отдельных файлах с помощью ключевого слова partial.

2️⃣ Объединение частей: Компилятор объединяет обе части класса Person в один класс. В результате, объект Person имеет все свойства и методы, определенные в обоих файлах.

🤔 Использование класса `Person`
class Program
{
static void Main(string[] args)
{
Person person = new Person
{
FirstName = "John",
LastName = "Doe",
Age = 30
};

person.PrintFullName(); // Выведет: John Doe
person.PrintAge(); // Выведет: Age: 30
}
}


🤔 Преимущества использования `partial` классов

1️⃣ Организация кода: Удобно организовывать большие классы, разделяя их на логические части.

2️⃣ Совместная разработка: Несколько разработчиков могут работать над одним классом параллельно, не создавая конфликты.

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

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

1️⃣ Требование компилятора: Все части partial класса должны быть определены в одном и том же сборочном проекте.

2️⃣ Отсутствие циклов между частями: Нельзя создавать циклические зависимости между частями partial класса.

🤔 Краткий ответ

Partial классы в C# позволяют разделять определение одного класса на несколько файлов. Это удобно для организации кода, совместной разработки и интеграции с инструментами, генерирующими код. Компилятор объединяет все части класса в один, что позволяет работать с ним как с обычным классом.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4