C# Flashcards

1
Q

LINQ

A

LINQ (Language-Integrated Query) - язык запросов к источнику данных (это может быть объект IEnumerable, DataSet, DbSet (EF Core), документ XML) независимо от типа источника.

Виды LINQ:
- LINQ to Objects: применяется для работы с массивами и коллекциями
- LINQ to Entities: используется при обращении к базам данных через технологию Entity Framework
- LINQ to XML: применяется при работе с файлами XML
- LINQ to DataSet: применяется при работе с объектом DataSet
- Parallel LINQ (PLINQ): используется для выполнения параллельных запросов

Два способа работы с коллекциями:
1) Операторы запросов LINQ:
var selectedPeople = from p in people
where p.ToUpper().StartsWith(“T”) //фильтрация по критерию
orderby p // упорядочиваем по возрастанию
select p;
2) Методы расширений LINQ:
var selectedPeople = people.Where(p => p.ToUpper().StartsWith(“T”)).OrderBy(p => p);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Отложенное и немедленное выполнение LINQ

A

LINQ-выражение не выполняется, пока не будет произведена итерация или перебор по выборке, например, в цикле foreach.
Операции с отложенным выполнением:
- все, кроме тех, что возвращают атомарное значение или один элемент или данные типов Array, List, Dictionary

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

PLINQ

A

PLINQ (Parallel LINQ) - позволяет выполнять обращения к коллекции в параллельном режиме, т.е. источник данных разделяется на сегменты, и каждый сегмент обрабатывается в отдельном потоке (при доступе к общему разделяемому состоянию в параллельных операциях будет неявно использоваться синхронизация, чтобы избежать взаимоблокировки доступа к этим общим ресурсам):
- работают с IEnumerable
- имеют отложенное выполнение

Методы PLINQ:
- AsParallel (позволяет распараллелить запрос к источнику данных)
- ForAll (позволяет обработать результаты в том же потоке, в котором они обрабатываются)
- AsOrdered (упорядочивание результата в соответствие с исходной последовательностью)
- AsUnordered (отключение включенного ранее упорядочивания)
- WithDegreeOfParallelism (Указывает максимальное количество процессоров)
- WithCancellation (Прерывание параллельной операции, в качестве параметра передается токенCancellationToken)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Оптимизация работы PLINQ запросов

A

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

Факторы, влияющие на производительность запросов PLINQ:
- Для небольших коллекций с не затратными функциями PLINQ не стоит использовать
- параллельные запросы работают быстрее на компьютерах, которые имеют больше ядер
- работает лучше всего, если есть возможность обрабатывать элементы исходной коллекции в любом порядке (без упорядочивания)
- В PLINQ можно включить буферизацию, чтобы возвращать результаты блоками или целиком после завершения работы - это уменьшает общее время выполнения

В каких случаях PLINQ выбирает последовательный режим:
PLINQ ищет операторы запросов или сочетания операторов, которые обычно вызывают выполнение запроса более медленно в параллельном режиме - и в таком случае переходит на последовательный режим:
- запросы с Take, TakeWhile, Skip, SkipWhile (в которых индексы исходной последовательности не сохраняют исходный порядок)
- Запросы с Concat, Reverse

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

TPL Parallel

A

Parallel - класс библиотеки TPL, предназначенный для упрощения параллельного выполнения кода, с методами:
- Parallel.Invoke (параллельно выполняет задачи):
Parallel.Invoke(
Print,
() =>
{
Console.WriteLine($”Выполняется задача {Task.CurrentId}”);
Thread.Sleep(3000);
},
() => Square(5)
);
- Parallel.For (позволяет выполнять итерации цикла параллельно)
- Parallel.ForEach (осуществляет параллельный перебор коллекции):
ParallelLoopResult result = Parallel.ForEach<int>(
new List<int>() { 1, 3, 5, 8 },
Square
);</int></int>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Когда следует использовать Parallel, а когда PLINQ

A

1) Если важен порядок элементов, тогда PLINQ (т.к. есть встроенный метод AsOrdered)
2) Если работа со стримами (получаем элементы коллекции на каждой итерации foreach), тогда PLINQ:
- нет избыточности хранения данных в памяти
- есть внутренние буферы и можно настраивать их размер
3) Если нужно работать с локальными переменными потока, тогда Parallel

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Многопоточность

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Синхронизация потоков

A

Синхронизация потоков - механизм предотвращения состояния гонки потоков и конфликтов при доступе к общему состоянию.
Объекты синхронизации потоков:
- Mutex (Обеспечивает поочерёдный доступ к объекту)
- Semaphore (Обеспечивает поочерёдный доступ к объекту для нескольких потоков сразу)
- События:
- ManualResetEvent
- AutoResetEvent
- CountdownEvent
- Monitor (Критическая секция - область кода, которую может выполнять лишь 1 поток одновременно)
- Interlocked (Примитивные атомарные операции):
Interlocked.Increment(ref num);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Mutex

A

Mutex - системный объект, который может принадлежать только одному потоку единовременно, может быть рекурсивным (т.е. поток, владеющим мьютексом, может брать его несколько раз - и столько же раз освободить его), освободить мьютекс может только поток, владеющий им:
- mutex.WaitOne( ) //Получить контроль над мьютексом. Подождать при необходимости
- mutex.ReleaseOne( ) //Освободить мьютекс - он переходит в сигнальное состояние

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Semaphore

A

Semaphore - системный объект синхронизации, позволяющий ограничить количество потоков, которые имеют доступ к общим ресурсам (типо счетчик (мьютекс - это счетчик из 1 объекта)), семафоры могут быть рекурсивными, освободить семафор можно из любого потока):
- new Semaphore (int current, int max) //Создать семафор в определённом состоянии с заданным лимитом
- semaphore.WaitOne( ) //получить контроль над одним из N объектов
- semaphore.Release( ) //освободить один из N объектов

SemaphoreSlim - упрощенная альтернатива Semaphore, не использует семафоры ядра Windows.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

События синхронизации

A

1) ManualResetEvent (событие с ручным сбросом):
- WaitOne() - Дождаться сигнального состояния. Текущий поток блокируется в ожидании
- Set() - Перевести событие в сигнальное состояние
- Reset() - Вернуть событие в барьерное состояние

2) AutoResetEvent (Событие с автоматическим сбросом):
- WaitOne() - Дождаться сигнального состояния. Текущий поток блокируется в ожидании
- Set() - Перевести событие в сигнальное состояние (один поток разблокируется и войдёт, а остальные продолжат ожидать. Событие тут же вернётся в барьерное состояние).

3) CountdownEvent (переходит в сигнальное состояние, когда счётчик достигает нуля):
- Wait() - Надо дождаться сигнального состояния. Текущий поток блокируется в ожидании
- Siganl() - Уменьшить счётчик на 1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Monitor (Критическая секция)

A

Критическая секция - Участок кода, который должен выполняться не более чем 1 потоком одновременно.
Monitor - механизм синхронизации .NET, позволяет маркировать регионы кода:
- Monitor.Enter(object key) - Маркирует начало критической секции. Берёт контроль над ресурсом. Блокируется при необходимости
- Monitor.TryEnter(object key) - Осторожно пытается взять контроль над ключом. Возможно, не получается.
- Monitor.Exit(object key) - Маркирует конец критической секции. Отдаёт ресурс

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

lock

A

lock - синтаксический сахар, исп. Monitor:
lock (объект-ключ) {
//Действия критической секции
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

TPL (Task Parallel Library)

A

TPL (Task Parallel Library) - библиотека классов для многопоточного программирования, представляет собой абстракцию над Thread, основан на пуле потоков.

Комбинирование задач:
- Последовательное соединение:
Task.Run (( ) => 5)
.ContinueWith (prevTask => prevTask.Result * 2))
.ContinueWith (prevTask => prevTask.Result * 2)
.Wait ( );
- Параллельное соединение (оборачивают группу Task-ов в один Task):
Task.WhenAll(tasks); //завершится, когда все задачи завершатся
Task.WhenAny(tasks); //завершится, когда хотя бы одна задача завершится

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

async/await

A

Цель паттерна async/await — позволить писать асинхронный код в привычном, последовательном стиле:
- весь код после await неявно становится одним большим колбэком
- при await текущий (асинхронный) метод засыпает, а управление возвращается в вызывающий поток, поэтому он не блокируется при длительных операциях, а когда ожидаемая задача выполнится асинхронный метод просыпается и продолжает выполнение

async - модификатор, который применяется к методу, указывая, что метод является асинхронным и внутри него можно использовать await.
- возвращаемые значения: void, Task, Task<T>, ValueTask<T></T></T>

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Абстрактный класс vs Интерфейс

A

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

Абстрактный класс - класс, от которого нельзя создать экземпляр напрямую, предназначен для описания общего поведения и состояния своих подклассов:
- может содержать как абстрактные методы (без реализации), так и методы с реализацией
- наследники обязаны реализовать все абстрактные методы
- класс может наследовать только от одного класса
- могут иметь конструкторы и деструкторы
- можно использовать различные модификаторы доступа
- Абстрактный класс используется, когда классы-наследники имеют много общего и должны наследовать некоторую реализацию

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Делегат

A

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

// Определение делегата
public delegate int Operation(int x, int y);

// Создание экземпляра делегата, ссылающегося на метод Add
Operation op = Add;
// Вызов метода через делегат
int result = op(5, 5);

// Делегат теперь ссылается на метод Subtract
op = Subtract;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Сборка мусора (Garbage Collection, GC)

A

Сборка мусора (Garbage Collection, GC) - автоматически управляет выделением и освобождением памяти в управляемом куче.

Сборка мусора инициируется CLR автоматически в следующих ситуациях:
1) Недостаток памяти
2) Достигнут порог выделения памяти поколения объектов
3) Вызов GC.Collect()
4) Завершение работы приложения
5) Низкий уровень памяти в системе

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

string VS StringBuilder

A

string - класс, представляет неизменяемые строки (при каждой операции, изменяющей строку, создается новый экземпляр).
StringBuilder - класс для создания и модификации строк без необходимости каждый раз создавать новый экземпляр, поддерживает изменяемый буфер для хранения символов, что позволяет выполнять операции, такие как добавление, удаление и вставка символов, с меньшими накладными расходами по памяти и производительности:
StringBuilder sb = new StringBuilder(“Hello”);
sb.Append(“, World!”); // Просто добавляет “, World!” к существующему буферу

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Лямбда-выражения в С#

A

Лямбда-выражения - сокращённый способ записи анонимных методов, то есть методов без имени, особенно полезны в LINQ:
() => Console.WriteLine(“Привет, мир!”);
x => x * x; // Возвращает квадрат x
(x, y) => x + y; // Складывает x и y

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Middleware (ASP.NET core)

A

Middleware - программные компоненты, которые выполняются при каждом запросе к приложению и обрабатываются в порядке добавления в конвейер обработки запроса, могут выполнять различные задачи, такие как аутентификация, логирование, обработка ошибок, управление сессиями
- компоненты middleware добавляются в конвейер с помощью метода Use

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Inversion of Control (IoC) и Dependency Injection (DI)

A

Inversion of Control (IoC) - принцип программирования, при котором управление потоком программы передаётся из пользовательского кода во внешнюю библиотеку или фреймворк.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

является ли List потокобезопасной коллекцией?

A

нет, можно сделать потокобезопасную реализацию, обернув все операции в lock

24
Q

В чем различие между операцией cast (приведения типов) и оператором as?

A

В случае ошибки cast выбрасывает исключение InvalidCastException, а оператор as возвращает null.

25
Q

Какова алгоритмическая сложность для операций чтения и записи для коллекции Dictionary?

A

Чтение – О(1) (т.к. берется по хэшу (это индекс в большом массиве)), запись – О(1) в лучшем случае (когда место есть), O(n) в худшем случае (когда места нет и нужно перевыделять память и копировать туда все элементы)

26
Q

В чем различие между ключевыми словами “ref” и “out”?

A

Параметр с ключевым слово out может быть не инициализирован (но необходимо инициализировать его в теле функции), а параметр с ключевым словом ref обязательно должен быть инииализирован до вызова метода, который использует эти параметры

27
Q

Методы класса Monitor?

A
  • void Enter(object obj) //получает в эксклюзивное владение объект, передаваемый в качестве параметра
  • void Exit(object obj) //освобождает ранее захваченный объект
  • void Pulse (object obj) //уведомляет поток из очереди ожидания, что текущий поток освободил объект obj
  • void PulseAll(object obj) //уведомляет все потоки из очереди ожидания, что текущий поток освободил объект obj. После чего один из потоков из очереди ожидания захватывает объект obj
  • bool TryEnter (object obj) //пытается захватить объект obj. Если владение над объектом успешно получено, то возвращается значение true
  • bool Wait (object obj) //освобождает блокировку объекта и переводит поток в очередь ожидания объекта. Следующий поток в очереди готовности объекта блокирует данный объект. А все потоки, которые вызвали метод Wait, остаются в очереди ожидания, пока не получат сигнала от метода Monitor.Pulse или Monitor.PulseAll, посланного владельцем блокировки.
28
Q

Что такое обобщения в C#?

A

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

29
Q

В чём разница между ключевыми словами readonly и const в C#?

A

Ключевое слово readonly в C# используется для полей экземпляров, которые могут быть присвоены только во время объявления или в конструкторе. После присвоения их значения невозможно поменять.
Ключевое слово const используется для статических констант, которые можно только прочесть и нельзя изменить во время работы программы. Полям const нужно присваивать значение во время объявления».

30
Q

В чём разница между throw и throw ex в обработке исключений в C#?

A

В C#, инструкция throw используется для вызова исключения и сохранения его оригинальной трассировки стека. Throw ex же повторно вызывает исключение после catching it, но он сбрасывает трассировку стека

31
Q

ADO.NET

A

ADO.NET — это набор классов, предоставляющих службы доступа к данным программистам, которые используют платформу .NET Framework

32
Q

В чем разница между структурой и классом в C#

A

Структура является типом значения в C# и наследует от System.Value Type.
Struct обычно используется для небольших объемов данных.
Struct не может быть унаследован от других типов.
Структура не может быть абстрактной.
Нет необходимости создавать объект с новым ключевым словом.
Не имеете разрешения на создание конструктора по умолчанию

Класс является ссылочным типом в C# и наследует от типа System.Object.
Классы обычно используются для больших объемов данных.
Классы могут быть унаследованы от других классов.
Класс может быть абстрактным типом.
Мы можем создать конструктор по умолчанию.

33
Q

Что такое перечисление в C#?

A

Перечисление — это значимый тип с набором связанных именованных констант, объявляется ключевым словом enum.
Базовый тип по умолчанию элемента перечисления — int.
System.Enum - это базовый класс для перечислений (наследует ValueType).

34
Q

ValueType C#

A

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

35
Q

Можно ли использовать «this» внутри статического метода ?

A

ключевое слово ‘this’ возвращает ссылку на текущий экземпляр класса, содержащего его, поэтому не можем использовать в статическом методе

36
Q

Что такое свойства в C#?

A

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

37
Q

метод расширения в C#?

A

В C# метод расширения — это статический метод, используемый для расширения функциональности существующего типа без изменения исходного типа или создания нового производного типа. Методы расширения позволяют разработчикам добавлять методы к существующим типам, таким как классы, структуры, интерфейсы, перечисления и т. д., изначально не определенные в этих типах.
Методы расширения объявляются в статическом классе и определяются как статические методы со специальным первым параметром, называемым параметром “this”. Параметр “this” указывает тип, который расширяется, и позволяет вызывать метод расширения, как если бы он был методом экземпляра этого типа.

38
Q

Что такое запечатанные (sealed) классы в C#?

A

sealed класс - не может быть унаследован.

39
Q

Что такое частичные классы в C#?

A

Частичный класс используется только для разделения определения класса на два или более классов в одном или нескольких файлах, которые будут скомпилированы как один класс во время выполнения.
Частичные классы могут быть созданы в одном и том же пространстве имен с помощью ключевого слова «partial»

40
Q

В чем разница между упаковкой и распаковкой в ​​C#?

A

Упаковка — это преобразование типа данных типа значения в тип объекта (CLR оборачивает значение в System.Object и сохраняет его в куче).

Распаковка — это также процесс извлечения типа значения из объекта или любого реализованного типа интерфейса. Упаковка может быть выполнена неявно, но распаковка должна быть явной в коде.

41
Q

Что такое IEnumerable<T> в C#?</T>

A

IEnumerable — это родительский интерфейс для всех необобщенных коллекций в пространстве имен System.Collections, таких как ArrayList, HastTable.
IEnumerable<T> - обобщенный интерфейс для коллекций (System.Collections.Generic) с методом:
- GetEnumerator() - возвращает IEnumerator (предоставляет возможность итерации по коллекции, предоставляя свойство Current и методы Move Next и Reset)</T>

42
Q

раннее и позднее связывание c#

A

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

Позднее связывание в C# означает, что объект связывается с вызовом функции только во время исполнения программы, а не раньше. 1 Для его реализации в C# используется ключевое слово virtual, которое записывается в заголовке метода базового класса. Объявление метода виртуальным означает, что все ссылки на этот метод будут разрешаться в момент его вызова во время выполнения программы. 2

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

43
Q

В чем разница между IEnumerable и IQueryable?

A

IEnumerable предназначен для работы с коллекциями данных в памяти. Объект IEnumerable представляет набор данных и может перемещаться по ним только вперёд. Запрос, представленный объектом IEnumerable, выполняется немедленно и полностью, поэтому получение данных приложением происходит быстро.

Интерфейс IQueryable (System.Linq) наследует интерфейс IEnumerable. IQueryable используется для работы с внешними источниками данных, которые могут находиться вне памяти (БД, веб-сервисами или удалёнными хранилищами данных). Объект IQueryable предоставляет удалённый доступ к базе данных и позволяет перемещаться по данным как в прямом порядке от начала до конца, так и в обратном порядке.

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

44
Q

В чем разница между Array.CopyTo() и Array.Clone()?

A

Метод Array.Clone() создает поверхностную копию массива. Неглубокая копия массива копирует только элементы массива, будь то ссылочные типы или типы значений, но не копирует объекты, на которые ссылаются ссылки. Ссылки в новом массиве указывают на те же объекты, что и в исходном массиве.

Статический метод CopyTo() класса Array копирует часть массива в другой массив. Метод CopyTo копирует все элементы массива в другой массив.

45
Q

Что такое индексаторы в C#?

A

Индексатор в C# — подобен свойству, не имеет названия, вместо которого всегда указывается ключевое слово this, позволяют индексировать объекты и обращаться к данным по индексу (может быть частным, публичным, защищенным или внутренним).

class Company
{
Person[] personal;
public Company(Person[] people) => personal = people;

// индексатор
public Person this[int index]
{
    get => personal[index];
    set => personal[index] = value;
} }
46
Q

Итераторы и оператор yield

A

Итератор - блок кода, который использует оператор yield для перебора набора значений:
- yield return: определяет возвращаемый элемент
- yield break: указывает, что последовательность больше не имеет элементов

Пример:
Numbers numbers = new Numbers();
foreach (int n in numbers)
{
Console.WriteLine(n);
}

class Numbers
{
public IEnumerator<int> GetEnumerator()
{
for (int i = 0; i < 6; i++)
{
yield return i * i;
}
}
}</int>

47
Q

Разница между оператором равенства (==) и методом Equals() в C#

A

Оператор == и метод Equals() сравнивают два элемента данных типа значения или элемента данных ссылочного типа. Оператор равенства (==) является оператором сравнения, а метод Equals() сравнивает содержимое строки. Оператор == сравнивает ссылочную идентичность, тогда как метод Equals() сравнивает только содержимое.

Исключения: для строк оператор == проверяет равенство значений, а для остальных классов (унаследованных от System.Object и не переопределивших метод Equals), метод Equals проверяет равенство ссылок

48
Q

оператор is

A

оператор is позволяет автоматически преобразовать значение к типу, если это значение представляет данный тип:
Person person = new Person(“Tom”);
if (person is Employee employee)
{
Console.WriteLine(employee.Company);
}

49
Q

типы Nullable<> в C#

A

System.Nullable<T> - структура, позволяющая работать со значимыми типами, как если бы они допускали null.
Имеет свойства:
- Value - значение
- HasValue: возвращает true, если объект хранит некоторое значение, и false, если объект равен null.</T>

50
Q

Проверка на null, операторы ?. и ??

A

Оператор ?? называется оператором null-объединения:
- возвращает левый операнд, если этот операнд не равен null. Иначе возвращается правый операнд. При этом левый операнд должен принимать null.

Пример:
string? text = null;
string name = text ?? “Tom”; // равно Tom, так как text равен null

Оператор ?. - это оператор условного null, если объект не равен null, то происходит обращение к компоненту объекта - полю, свойству, методу. Если объект представляет значение null, обращение к компоненту метода не происходит.

Пример:
//если person не равен null, то происходит обращение к его свойству Company. Если свойство Company не равно null, то идет обращение к свойству WebSite объекта Company
void PrintWebSite(Person? person)
{
Console.WriteLine(person?.Company?.WebSite?.ToUpper());
}

51
Q

способы перегрузки метода

A

Перегрузка метода заключается в том, что методы имеют разную сигнатуру, в которой совпадает только название метода. То есть методы должны отличаться по:
- Количеству параметров
- Типу параметров
- Порядку параметров
- Модификаторам параметров

51
Q

Пул объектов (Object Pool)

A

Пул объектов (Object Pool) — это паттерн, который позволяет повторно использовать объекты вместо создания новых (полезно при затратной инициализации объектов):
- доступен только в приложениях ASP.NET Core

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

52
Q

Что такое дженерики (Обобщения) в C#?

A

Обобщения - позволяют создавать классы и методы (с любым пользовательским параметром типа), откладывающие спецификацию одного или нескольких параметров типа, пока не будет использоваться класс или метод в коде.

53
Q

Что такое виртуальный метод в C#?

A

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

54
Q

Сериализация в C#?

A

Сериализация - преобразует объект в поток байтов для сохранения состояния объекта в памяти, базе данных или файле.
Типы сериализации:
1) Двоичная сериализация (сохранение данных объекта в двоичном формате)
2) Сериализация Soap (сохранение данных объекта в двоичном формате; в основном используется в сетевых коммуникациях).
3) XmlSerialization (сохранение данных объекта в XML-файле).

55
Q

Анонимные типы в C#

A

Анонимные типы (ссылочный тип) - позволяют создать объект с некоторым набором свойств без определения класса:
var user = new { Name = “Tom”, Age = 34 };

56
Q

Reflection в C#

A

Рефлексия - процесс выявления типов во время выполнения приложения.

  • System.Reflection
  • System.Type - позволяет получить информацию о членах типа:
    - Метод FindMembers() возвращает массив объектов MemberInfo данного типа
    - Метод GetConstructors() возвращает все конструкторы данного типа в виде набора объектов ConstructorInfo
    - Метод GetEvents() возвращает все события данного типа в виде массива объектов EventInfo
    - Метод GetFields() возвращает все поля данного типа в виде массива объектов FieldInfo
    - Метод GetInterfaces() получает все реализуемые данным типом интерфейсы в виде массива объектов Type
    - Метод GetMembers() возвращает все члены типа в виде массива объектов MemberInfo
    - Метод GetMethods() получает все методы типа в виде массива объектов MethodInfo
    - Метод GetProperties() получает все свойства в виде массива объектов PropertyInfo
    - Свойство Name возвращает имя типа
    - Свойство Assembly возвращает название сборки, где определен тип
    - Свойство Namespace возвращает название пространства имен, где определен тип
    - Свойство IsArray возвращает true, если тип является массивом
    - Свойство IsClass возвращает true, если тип представляет класс
    - Свойство IsEnum возвращает true, если тип является перечислением
    - Свойство IsInterface возвращает true, если тип представляет интерфейс