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

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

Backend собеседования - @frontview_backend
C# работа - @frontview_csharp_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
🔥 Как использовать методы расширения в 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
🔥 Как использовать Entity Framework для доступа к данным?

Entity Framework (EF) — это ORM (Object-Relational Mapping) фреймворк, который упрощает доступ к данным в приложениях C#. Он позволяет работать с базами данных, используя объекты, вместо прямого взаимодействия с SQL-запросами.

Для использования EF необходимо:

1. Установить пакет: Добавить Entity Framework в проект через NuGet.

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


public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}


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


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


4. Выполнять операции с данными: Использовать LINQ для выполнения CRUD-операций.


using (var context = new AppDbContext())
{
var products = context.Products.Where(p => p.Price > 100).ToList();
}


Entity Framework автоматизирует многие аспекты работы с базами данных, позволяя сосредоточиться на логике приложения.

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

Классы Directory и DirectoryInfo в C# предоставляют методы для работы с файловыми системами, позволяя управлять директориями.

Directory — это статический класс, который предоставляет методы для создания, перемещения, удаления и перечисления директорий. Пример использования:


// Создание директории
Directory.CreateDirectory(@"C:\ExampleDir");

// Проверка существования
bool exists = Directory.Exists(@"C:\ExampleDir");

// Удаление директории
Directory.Delete(@"C:\ExampleDir");


DirectoryInfo — это класс, который предоставляет аналогичные возможности, но через экземпляры, что позволяет сохранять состояние и информацию о директории. Пример:


var dirInfo = new DirectoryInfo(@"C:\ExampleDir");

// Создание директории
dirInfo.Create();

// Получение информации о файлах
FileInfo[] files = dirInfo.GetFiles();

// Удаление директории
dirInfo.Delete();


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

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

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

Основные компоненты паттерна:

1. Субъект (Subject): Объект, за которым наблюдают. Он хранит список наблюдателей и предоставляет методы для добавления и удаления наблюдателей.

2. Наблюдатель (Observer): Интерфейс или абстрактный класс, который определяет метод обновления, вызываемый субъектом для уведомления об изменениях.

3. Конкретные субъекты и наблюдатели: Реализуют интерфейсы субъекта и наблюдателя, определяя конкретное поведение при изменении состояния.

Пример реализации на C#:


public interface IObserver
{
void Update(string state);
}

public class ConcreteObserver : IObserver
{
public void Update(string state)
{
Console.WriteLine($"Observer notified with state: {state}");
}
}

public class Subject
{
private List<IObserver> observers = new List<IObserver>();
private string state;

public void Attach(IObserver observer) => observers.Add(observer);
public void Detach(IObserver observer) => observers.Remove(observer);

public void Notify()
{
foreach (var observer in observers)
{
observer.Update(state);
}
}

public string State
{
get => state;
set
{
state = value;
Notify();
}
}
}


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

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

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


public class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
}


В этом примере класс SampleCollection позволяет доступ к элементам массива arr через индексатор. Это упрощает работу с коллекциями, предоставляя интерфейс, аналогичный массивам, без необходимости раскрывать внутреннюю структуру данных. Индексаторы полезны в случаях, когда требуется предоставить доступ к элементам объекта по индексу, сохраняя инкапсуляцию.

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

Ключевое слово sealed в C# используется для ограничения наследования.

Sealed класс — это класс, который нельзя наследовать. Использование sealed предотвращает создание подклассов, что может быть полезно для повышения безопасности и производительности. Например:


public sealed class FinalClass
{
// Код класса
}


Sealed метод — это метод, который нельзя переопределить в производных классах. Он применяется только к методам, унаследованным от базового класса, и требует, чтобы метод был помечен как override. Например:


public class BaseClass
{
public virtual void Display() { }
}

public class DerivedClass : BaseClass
{
public sealed override void Display() { }
}


Использование sealed помогает контролировать поведение классов и методов, предотвращая нежелательные изменения в наследуемых структурах.

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

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

Пример конструктора:


public class MyClass
{
public int Value;
public MyClass(int initialValue)
{
Value = initialValue;
}
}


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

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

Синтаксис where в LINQ-запросах напоминает SQL и делает код более читаемым и выразительным. Он может быть использован как в методах расширения, так и в синтаксисе запросов.

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


var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);


В этом примере where фильтрует список numbers, выбирая только четные числа. Результатом будет коллекция, содержащая числа 2 и 4.

Использование where позволяет эффективно работать с данными, извлекая только нужные элементы из коллекций.

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

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

Существует два основных способа использования оператора using. Первый — это использование в виде инструкции:


using (var resource = new Resource())
{
// Работа с ресурсом
}


В этом случае Dispose() вызывается автоматически, когда блок using завершается.

Второй способ — это использование в виде директивы, которая позволяет импортировать пространство имен:


using System.Text;


Это упрощает доступ к типам в пространстве имен, устраняя необходимость указывать полное имя типа.

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

Ключевые слова virtual и override используются для реализации полиморфизма, позволяя производным классам изменять поведение методов, определённых в базовом классе.

Ключевое слово virtual используется в базовом классе для обозначения метода, который может быть переопределён в производных классах:


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


Ключевое слово override используется в производном классе для переопределения метода, помеченного как virtual в базовом классе:


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


При вызове метода Display через экземпляр DerivedClass, будет выполнена переопределённая версия метода. Это позволяет изменять поведение методов в зависимости от типа объекта.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2💯2
This и base — ключевые слова, которые используются для работы с объектами и наследованием.

1️⃣ this ссылается на текущий экземпляр класса. Оно часто применяется для доступа к членам класса, когда локальные переменные или параметры метода имеют те же имена, что и поля класса. Например, this.fieldName позволяет явно указать, что обращение идет к полю класса, а не к локальной переменной.

2️⃣ base используется для обращения к членам базового класса из производного. Это полезно, когда нужно вызвать метод или конструктор базового класса, который был переопределен в производном классе. Например, base.MethodName() вызывает метод базового класса, даже если он переопределен в текущем классе.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
📌 Using — это ключевое слово, которое упрощает управление ресурсами, такими как файлы, сетевые соединения и другие объекты, реализующие интерфейс IDisposable.

Конструкция using автоматически вызывает метод Dispose() для объекта, когда выполнение блока кода завершается, даже если произошло исключение. Это гарантирует освобождение ресурсов своевременно и безопасно.

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

using (var fileStream = new FileStream("file.txt", FileMode.Open))
{
// Работа с файлом
}


➡️В этом примере fileStream будет закрыт автоматически после завершения блока using, что предотвращает утечки ресурсов.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
ℹ️Подписывайся на наши новые каналы!

🖥 JS собеседования
🖥 Backend собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
📍 Операторы ref и out используются для передачи аргументов в методы по ссылке, что позволяет методам изменять значения этих аргументов.

🔘ref требует, чтобы переменная была инициализирована до передачи в метод. Это полезно, когда необходимо изменить значение переменной и вернуть его обратно в вызывающий код. Например:

void ModifyRef(ref int number) {
number += 10;
}

int value = 5;
ModifyRef(ref value);
// value теперь равно 15


🔘out используется, когда переменная не обязательно должна быть инициализирована перед передачей. Метод обязан присвоить значение переменной перед завершением. Это удобно для возврата нескольких значений из метода:

void GetValues(out int x, out int y) {
x = 10;
y = 20;
}

int a, b;
GetValues(out a, out b);
// a равно 10, b равно 20


Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Событие — это механизм, позволяющий объектам уведомлять другие объекты о произошедших действиях. События часто используются в графических интерфейсах для обработки пользовательских действий, таких как нажатия кнопок.

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

public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler MyEvent;


✔️Для вызова события используется метод, который проверяет, есть ли подписчики:

protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}


Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🔖 Event Handler - это метод, который вызывается при возникновении определенного события. Он представляет собой делегат, который определяет сигнатуру метода обработчика события.

В C# стандартный делегат для обработки событий - EventHandler, который принимает два параметра: object sender (источник события) и EventArgs e (аргументы события).

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

public event EventHandler MyEvent;

private void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}

// Подписка на событие
someObject.MyEvent += HandleMyEvent;

private void HandleMyEvent(object sender, EventArgs e)
{
// Обработка события
}

Event Handler позволяет реализовать слабую связность между компонентами и является ключевым элементом событийно-ориентированного программирования.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51🔥1🤔1