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

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

Backend собеседования - @frontview_backend
C# работа - @frontview_csharp_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
🔥 Что такое делегат?

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

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

Пример объявления делегата:

public delegate void Notify(string message);


Пример использования делегата:

public class Process {
public event Notify OnProcessCompleted;

public void StartProcess() {
// Процесс выполняется
OnProcessCompleted?.Invoke("Process completed");
}
}


В этом примере делегат Notify используется для объявления события OnProcessCompleted, которое вызывается после завершения процесса. Делегаты обеспечивают гибкость и расширяемость кода, позволяя динамически изменять поведение программы.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🔥 Как создавать пользовательские классы исключений?

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

При создании пользовательского исключения рекомендуется:

1. Унаследовать класс от Exception.
2. Определить конструкторы, которые вызывают базовые конструкторы Exception.
3. Переопределить метод GetObjectData, если требуется сериализация.

Пример пользовательского класса исключения:

public class InvalidUserInputException : Exception {
public InvalidUserInputException() { }

public InvalidUserInputException(string message) : base(message) { }

public InvalidUserInputException(string message, Exception inner) : base(message, inner) { }
}


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🔥 Что такое XPath и как его использовать?

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

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

Пример использования XPath в C#:

using System;
using System.Xml;

public class XPathExample {
public static void Main() {
string xml = "<books><book><title>C# Basics</title></book></books>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlNode node = doc.SelectSingleNode("/books/book/title");
Console.WriteLine(node.InnerText); // Output: C# Basics
}
}


В этом примере используется метод SelectSingleNode для извлечения элемента <title> из XML-документа. XPath выражение "/books/book/title" указывает путь к нужному элементу. XPath упрощает извлечение и обработку данных из сложных XML-структур.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🔥 Как использовать кэширование для улучшения производительности?

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

В C# кэширование можно реализовать с помощью различных подходов, включая использование MemoryCache из пространства имен System.Runtime.Caching.

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

using System;
using System.Runtime.Caching;

public class CacheExample {
public static void Main() {
MemoryCache cache = MemoryCache.Default;
string cacheKey = "dataKey";
string data = cache[cacheKey] as string;

if (data == null) {
data = "Expensive Data";
CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10) };
cache.Set(cacheKey, data, policy);
}

Console.WriteLine(data);
}
}


В этом примере данные кэшируются на 10 минут. Если данные отсутствуют в кэше, они вычисляются и добавляются в кэш. Кэширование помогает снизить нагрузку на ресурсы и улучшить время отклика приложения.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🔥 Что такое CI/CD?

CI/CD — это практика непрерывной интеграции и непрерывного развертывания (или доставки), которая автоматизирует процесс сборки, тестирования и развертывания программного обеспечения. Она помогает командам разработчиков быстро и надежно выпускать изменения в коде.

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

Непрерывное развертывание (CD) автоматизирует процесс доставки изменений в коде в производственную среду. Это может включать автоматическое развертывание после успешного прохождения всех тестов (непрерывное развертывание) или подготовку кода к развертыванию с возможностью ручного запуска (непрерывная доставка).

CI/CD способствует улучшению качества кода, сокращению времени выхода на рынок и повышению гибкости разработки. Инструменты, такие как Jenkins, GitLab CI/CD и GitHub Actions, часто используются для реализации этих практик.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔥 Как использовать top-level statements?

Top-level statements в C# позволяют писать программы без явного объявления класса или метода Main, упрощая синтаксис для небольших приложений и скриптов. Эта возможность появилась в C# 9.0 и делает код более читаемым и компактным.

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

Пример использования top-level statements:

using System;

Console.WriteLine("Hello, World!");

int Add(int a, int b) => a + b;

Console.WriteLine(Add(3, 4));


В этом примере код выполняется без явного объявления класса и метода Main. Top-level statements удобны для простых приложений и быстрого прототипирования, позволяя сосредоточиться на логике, а не на структуре программы.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🔥 Что такое структура и чем она отличается от класса?

Структура в C# — это тип данных, который используется для хранения значений. Она похожа на класс, но имеет несколько ключевых отличий.

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

Основные отличия структур от классов:

1. Наследование: Структуры не поддерживают наследование, но могут реализовывать интерфейсы.

2. Конструкторы: Структуры не могут иметь явных конструкторов без параметров. Компилятор автоматически создает конструктор по умолчанию.

3. Инициализация: Поля структуры должны быть инициализированы до использования.

4. Семантика копирования: При присваивании структуры создается копия всех данных, в то время как при присваивании класса копируется только ссылка.

Пример структуры:

public struct Point {
public int X { get; set; }
public int Y { get; set; }

public Point(int x, int y) {
X = x;
Y = y;
}
}


Структуры подходят для небольших, неизменяемых объектов, таких как координаты или временные метки.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
🔥 Что такое Docker и зачем он нужен?

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

Основные преимущества Docker:

1. Портативность: Контейнеры Docker работают одинаково в любой среде, что упрощает перенос приложений между различными системами и платформами.

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

3. Эффективность: Контейнеры используют ресурсы более эффективно по сравнению с виртуальными машинами, так как они разделяют ядро операционной системы.

4. Скорость: Запуск и остановка контейнеров происходит быстрее, чем виртуальных машин, что ускоряет разработку и тестирование.

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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💯1
🔥 Что такое target-typed new expressions и как они работают?

Target-typed new expressions в C# — это синтаксический сахар, введенный в C# 9.0, который позволяет опустить тип объекта при создании экземпляра, если компилятор может вывести его из контекста. Это упрощает код и делает его более читаемым.

Когда используется target-typed new, тип объекта определяется из контекста, например, из типа переменной, свойства или параметра метода, которому присваивается новый объект.

Пример использования target-typed new:

Point point = new(3, 4);


В этом примере компилятор выводит, что new(3, 4) создает экземпляр типа Point, основываясь на типе переменной point.

Target-typed new expressions особенно полезны в случаях, когда тип уже очевиден из контекста, что позволяет избежать дублирования информации и улучшает читаемость кода.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🔥 Что такое паттерн Dependency Injection и как его реализовать?

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

Основные способы реализации DI:

1. Конструкторная инъекция: Зависимости передаются через параметры конструктора.

2. Сеттерная инъекция: Зависимости устанавливаются через свойства или методы.

3. Интерфейсная инъекция: Зависимости передаются через интерфейс, который должен реализовать класс.

Пример конструкторной инъекции:

public interface ILogger {
void Log(string message);
}

public class ConsoleLogger : ILogger {
public void Log(string message) {
Console.WriteLine(message);
}
}

public class Service {
private readonly ILogger _logger;

public Service(ILogger logger) {
_logger = logger;
}

public void Execute() {
_logger.Log("Executing service");
}
}


В этом примере Service получает зависимость ILogger через конструктор. Это позволяет легко заменять реализацию ILogger для тестирования или изменения логики без изменения кода Service. DI часто реализуется с помощью контейнеров, таких как Microsoft.Extensions.DependencyInjection.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🔥 Что такое MemoryStream и когда его следует использовать?

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

Основные случаи использования MemoryStream:

1. Буферизация данных: Когда необходимо временно сохранить данные в памяти перед их дальнейшей обработкой или передачей.

2. Избегание ввода-вывода на диск: Для операций, где запись на диск избыточна или нежелательна, например, при тестировании.

3. Работа с бинарными данными: Удобен для преобразования данных в байты и обратно, например, при сериализации объектов.

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

using System;
using System.IO;
using System.Text;

public class MemoryStreamExample {
public static void Main() {
byte[] data = Encoding.UTF8.GetBytes("Hello, MemoryStream!");
using (MemoryStream memoryStream = new MemoryStream(data)) {
StreamReader reader = new StreamReader(memoryStream);
string text = reader.ReadToEnd();
Console.WriteLine(text); // Output: Hello, MemoryStream!
}
}
}


MemoryStream эффективен для сценариев, где требуется высокая скорость доступа к данным без необходимости их постоянного хранения.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🔥 Объясни разницу между модификаторами доступа

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

Основные модификаторы доступа:

1. public: Член доступен из любого места в коде, как внутри, так и вне сборки. Используется для открытого доступа.

2. private: Член доступен только внутри класса или структуры, в которой он объявлен. Это самый ограничительный модификатор, обеспечивающий полную инкапсуляцию.

3. protected: Член доступен внутри своего класса и производных классов. Позволяет наследникам использовать и переопределять функциональность.

4. internal: Член доступен только внутри текущей сборки. Полезен для ограничения доступа к компонентам библиотеки.

5. protected internal: Член доступен как внутри текущей сборки, так и в производных классах, даже если они находятся в другой сборке.

6. private protected: Член доступен внутри своего класса и производных классов, но только в пределах текущей сборки.

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

public class Example {
private int privateField;
protected int protectedField;
internal int internalField;
public int publicField;
}


Выбор модификатора зависит от требований к безопасности и архитектуре приложения.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🔥 Объясни перегрузку методов и переопределение методов

Перегрузка и переопределение методов — это два разных механизма в C#, которые позволяют изменять поведение методов.

Перегрузка методов (Method Overloading) — это возможность создавать несколько методов с одинаковым именем, но с разными параметрами (типами, количеством или порядком). Перегрузка позволяет использовать один и тот же метод для выполнения различных задач в зависимости от переданных аргументов.

Пример перегрузки:

public class Calculator {
public int Add(int a, int b) {
return a + b;
}

public double Add(double a, double b) {
return a + b;
}
}


Переопределение методов (Method Overriding) — это механизм, позволяющий производному классу предоставлять свою реализацию метода, который уже определен в базовом классе. Для этого используется ключевое слово override. Метод в базовом классе должен быть объявлен с модификатором virtual, abstract или override.

Пример переопределения:

public class Animal {
public virtual void Speak() {
Console.WriteLine("Animal sound");
}
}

public class Dog : Animal {
public override void Speak() {
Console.WriteLine("Bark");
}
}


Перегрузка позволяет создавать методы с разной сигнатурой, а переопределение — изменять поведение унаследованных методов.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🔥 Что такое XSS и как его предотвратить?

XSS (Cross-Site Scripting) — это уязвимость безопасности веб-приложений, позволяющая злоумышленникам внедрять вредоносные скрипты на страницы, просматриваемые другими пользователями. Эти скрипты могут похищать данные, такие как куки и сессии, или выполнять другие нежелательные действия от имени пользователя.

Для предотвращения XSS в C# приложениях необходимо:

1. Использовать функции кодирования HTML и JavaScript, такие как HttpUtility.HtmlEncode и HttpUtility.JavaScriptStringEncode, чтобы обезопасить выводимые данные.

2. Применять валидацию и фильтрацию входных данных, чтобы убедиться, что они соответствуют ожидаемым форматам.

3. Включать Content Security Policy (CSP), чтобы ограничить выполнение скриптов только доверенными источниками.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
🔥 Как используются делегаты?

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

Основные применения делегатов:

1. Обработчики событий: Делегаты используются для определения событий и их обработчиков. Например, в Windows Forms и WPF делегаты связывают события с методами, которые их обрабатывают.

2. Функции обратного вызова: Делегаты позволяют передавать методы в качестве аргументов другим методам, что полезно для реализации обратных вызовов.

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

Пример объявления делегата:


public delegate void MyDelegate(string message);


Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1🤔1
🔥 Как использовать методы расширения в LINQ?

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

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

Пример метода расширения для LINQ:


public static class LinqExtensions
{
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (var item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
}


Этот метод расширения Filter может использоваться с любым IEnumerable<T> для фильтрации элементов, аналогично стандартному Where в LINQ.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💯1
🔥 Как использовать with выражения?

with выражения в C# используются для создания новых экземпляров неизменяемых типов с изменением некоторых их свойств. Это особенно полезно при работе с record-типами, которые поддерживают неизменяемость и структурное сравнение.

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


public record Person(string Name, int Age);

var original = new Person("Alice", 30);
var modified = original with { Age = 31 };


В этом примере создается новый объект modified на основе original, но с измененным значением свойства Age. with выражения позволяют легко и безопасно создавать измененные копии объектов, сохраняя неизменяемость исходных данных.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
🔥 Объясни разницу между временем компиляции и временем выполнения

Время компиляции и время выполнения — это два ключевых этапа в жизненном цикле программы.

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

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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🔥 Какие поколения существуют в сборщике мусора?

Сборщик мусора в .NET управляет памятью, разделяя объекты на три поколения для оптимизации производительности: поколение 0, поколение 1 и поколение 2.

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

Поколение 1 служит промежуточным этапом между поколениями 0 и 2. Объекты, пережившие сборку в поколении 0, перемещаются сюда. Это поколение используется для объектов средней продолжительности жизни.

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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
🔥 Что такое event?

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

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

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


public class Publisher
{
public event EventHandler SomethingHappened;

public void TriggerEvent()
{
SomethingHappened?.Invoke(this, EventArgs.Empty);
}
}

public class Subscriber
{
public void OnSomethingHappened(object sender, EventArgs e)
{
// Реакция на событие
}
}


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7