Pull to refresh

Краткое описание терминов С#

Reading time17 min
Views24K

Здесь можно найти ответы (в виде описания терминов) на вопросы в этой статье, к вакансии Мидл программист Unity.  Или попросту узнать что-нибудь новенькое. Статья будет постепенно дополнятся (возможно простейшими примерами).

императивное
, процедурное, функциональное, ООП

парадигмы программирования

Cовокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию)

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

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

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

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

ссылка - описание и примеры
вики - более подробное описание этих и других парадигм

абстракция, инкапсуляция, наследование, полиморфизм

принципы ооп

абстракция - придание объекту характеристик, которые отличают его от всех объектов, четко определяя его концептуальные границы

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

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

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

ссылка - большее описание принципов
ссылка - статья с множеством ссылок на объяснения и примеры

SOLID, KISS, DRY, YAGNI

принципы проектирования

SOLID - аббревиатура пяти основных принципов проектирования в ооп
ссылка - статья со множеством ссылок на объяснения и примеры по SOLID

KISS - "чем проще - тем лучше", но это не означает сделать быстро и кое как
DRY - "не повторяйся", и это следует понимать буквально
YAGNI - "тебе это не нужно", не прописывай функции, которые могут и не понадобиться в будущем

ссылка - подробности

MVC, MVP, MVVM, ECS

шаблоны проектирования

MVC (Model-View-Controller) - Модель-Представление-Контроллер - это схема, предполагающая разделение данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента, чтобы каждый из них можно было независимо модифицировать
ссылка - объяснение и пример

MVP (Model-View-Presenter) - является производным от MVC, но при этом имеет несколько иной подход. Основное отличие — представление (presenter) не так сильно связано моделью (model)
ссылка - объяснение пример

MVVM (Model-View-ViewModel) - состоит из трех компонентов: модели (Model), модели представления (ViewModel) и представления (View)
ссылка - объяснение и пример
ссылка - еще

ECS (Entity Component System ) - Сущность Компонент Система - данный паттерн является независимым от какого-либо “движка” и может быть реализован множеством способов. Все “сущности”, “системы” и “компоненты” должны где-то храниться и каким-то образом инициализироваться — все это является особенностями реализации каждого ECS решения для конкретного “движка”.
Логика в ECS обязательно должна быть отделена от данных
ссылка - объяснение и примеры

aссоциация, композиция, агрегация, делегация

отношения между объектами

aссоциация - когда один класс включает в себя другой класс в качестве одного из полей. Ассоциация описывается словом «имеет». Автомобиль имеет двигатель. Вполне естественно, что он не будет являться наследником двигателя (хотя такая архитектура тоже возможна в некоторых ситуациях)

Выделяют два частных случая ассоциации: композицию и агрегацию

композиция - когда двигатель не существует отдельно от автомобиля. Он создается при создании автомобиля и полностью управляется автомобилем. В типичном примере, экземпляр двигателя будет создаваться в конструкторе автомобиля (последний не может существовать вне первого)

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

делегация - когда объект передаёт ответственность за выполнение некоторого поведения другому объекту

ссылка - описание и примеры

value type (тип значений), reference type (ссылочный тип)

типы по обращению к памяти

value type (тип значений) - хранит свои значения в области памяти "стек" - все числовые значения, bool, char, enum, struct. Является производным от System.ValueType, который является производным от System.Object.

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

reference type (ссылочный тип) - object, string, class, interface, record, delegate, все массивы. При создании объекта, в "стек" помещается ссылка - на адрес области памяти "куча". Когда объект ссылочного типа перестает использоваться, в дело вступает автоматический сборщик мусора: он видит, что на объект в куче нету больше ссылок, условно удаляет этот объект и очищает память - фактически помечает, что данный сегмент памяти может быть использован для хранения других данных.

Объявляемая переменная с типом reference type будет содержать значение null до тех пор, пока вы не назначите ей экземпляр такого типа или не создадите его с помощью оператора new. Все массивы являются ссылочными типами, даже если их элементы являются типами значений.

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

ссылка - объяснения с примерами про разницу между этими типами
ссылка - подробное описание типов от майкрософт

стек(stack), куча(heap)

область памяти

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

куча(heap) - область памяти по типу "склада". Хранит ссылочные типы (при работе с ссылочными типами переменные указывают на область памяти в стеке, где хранятся ссылки (адреса объектов) на объекты в основном хранилище - куче. То есть, используя косвенную адресацию, мы получаем данные).
В С# сборщик мусора помогает очищать кучу от "использованных" объектов

ссылка - более подробно

class, struct, interface, record

пользовательские типы

class - (reference type) представляет собой "шаблон", по которому определяется "форма" объекта. В нем указываются данные(поля, свойства...) и код (методы...), который будет оперировать этими данными. Класс представляет собой ряд схематических описаний способа построения объекта. Класс является логической абстракцией. Физическое представление класса появится в оперативной памяти лишь после того, как будет создан объект этого класса.

Класс может реализовывать несколько интерфейсов, но наследоваться только от одного класса.

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

struct - (value type) пользовательский тип данных, который используется наряду с классами и может содержать какие-либо данные и методы (cтруктурами также являются такие типы данных как int, double и т.д. ). В основном используются для проектирования небольших ориентированных на данные типов, которые предоставляют минимум поведения или не предоставляют его вовсе. Поскольку типы структуры имеют семантику значений, рекомендуется определять неизменяемые типы структур
ссылка - объяснение с примерами
ссылка - документация майкрософт

interface - (reference type) пользовательский тип который определяет свойства и методы без реализации, которые появятся в классе, который и будет их реализовывать. Каждый класс может реализовывать методы одного интерфейса по разному
ссылка - статья со множеством ссылок на объяснения и примеры
ссылка - документация майкрософт

record - представляют новый ссылочный тип(reference type), который появился в C#9. Ключевая особенность record состоит в том, что он может представлять неизменяемый (immutable) тип, который по умолчанию обладает рядом дополнительных возможностей по сравнению с классами и структурами. (Зачем нужны неизменяемые типы? Такие типы более безопасны в тех ситуациях, когда надо гарантировать, что данные объекта не будут изменяться. В .NET в принципе уже есть неизменяемые типы, например, String). C версии C# 10 добавлена поддержка структур record, соответственно можно создавать record-классы и record-структуры
ссылка - описание и примеры
ссылка - документация майкрософт

object, component, behavior, monobehavior

наследование в юнити

object (объект) - базовый класс C# от которого наследуется все остальное. Так же и для Unity - базовый класс для всех объектов, на которые можно ссылаться

component (компонент) - наследуется от object. Базовый класс всего, что крепится к объекту

behavior (поведение) - наследуется от component . Поведение это компонент, который может быть включен или выключен

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

При использовании C# вы должны явно наследоваться от MonoBehaviour.

MonoBehaviour - это базовый класс, от которого наследуется каждый скрипт Unity
ссылка - документация юнити - методы MonoBehaviour
ссылка - жизненный цикл MonoBehaviour с примерами
ссылка - жизненный цикл MonoBehaviour - документация юнити

covariance, contravariance, invariance

вариантность использования

ковариантность (covariance) - позволяет использовать более конкретный тип, чем заданный изначально

контравариантность (contravariance) - позволяет использовать более универсальный тип, чем заданный изначально

инвариантность (invariance) - позволяет использовать только заданный тип

Вся суть вариантности состоит в использовании в производных типах преимуществ наследования. Известно, что если два типа связаны отношением "предок-потомок", то объект потомка может храниться в переменной типа предка. На практике это значит, что мы можем использовать для каких-либо операций объекты потомка вместо объектов предка. Тем самым, можно писать более гибкий и короткий код для выполнения действий поддерживаемых разными потомками с общим предком

ссылка - объяснение
ссылка - объяснение с примером
ссылка - объяснение с примером
ссылка - документация майкрософт

поле, свойство, индексатор, конструктор

про переменные

field (поле) - является переменной любого типа, которая объявлена непосредственно в классе или структуре

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

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

indexer (индексатор) - позволяет индексировать объекты и обращаться к данным по индексу. Фактически с помощью индексаторов мы можем работать с объектами как с массивами. По форме они напоминают свойства со стандартными блоками get и set, которые возвращают и присваивают значение.
В отличие от свойств индексатор не имеет названия
ссылка - описание и примеры
ссылка - документация майкрософт

constructor (конструктор) - это специальная функция, вызываемая автоматически при инициализации объекта. Ее имя совпадает с именем класса, которому она принадлежит. Конструкторы полезны для инициализации полей
ссылка - объяснение с примерами
ссылка - документация майкрософт

метод, функция, процедура, подпрограмма, операция

практически одно и тоже

метод в ооп - это функция или процедура, принадлежащая какому-то классу или объекту

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

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

подпрограмма - это отдельная функционально независимая часть программы

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

ссылка - разные мнения по поводу этих терминов

get, set, init

свойство

get - возвращает значение
set - устанавливает значение
ссылка - описание с примерами

init - (вместо set) задает значение только во время создания объекта. Это обеспечивает неизменяемость, чтобы после инициализации объекта его нельзя было изменить снова
ссылка - (init)документация майкрософт

public, private, protected, internal, sealed, static, readonly 

модификаторы доступа

public - доступно из любого места программы

private - доступно только внутри класса

protected - доступно в базовом классе и его наследниках

private protected - доступен из любого места в своем классе или в производных классах, которые определены в той же сборке

internal - доступен из любого места кода в той же сборке, однако он недоступен для других программ и сборок

protected internal - доступен из любого места в текущей сборке и из производных классов, которые могут располагаться в других сборках

sealed - запрещает другим классам наследоваться от этого класса или наследовать метод

static - доступ возможен без объявления экземпляра (то есть напрямую)
ссылка - подробней о static

readonly - (доступен для чтения) в целом этот модификатор означает "неизменяемость переменной после ее объявления". Применяется к полю, структуре, и в возврате метода
ссылка - документация по readonly 

ссылка - объяснение с примерами
ссылка - документация майкрософт

abstract, virtual, override

модификаторы

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

virtual - этот метод может быть переопределен любым наследующим его классом
ссылка - документация майкрософт

override - (переопределяет) требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события
ссылка - документация майкрософт

for, foreach, while, do

циклы

ссылка - описание с примерами
ссылка - документация майкрософт

for - выполняется пока логическое условие принимает значение true

foreach - предназначен для перебора набора или коллекции элементов

while - сразу проверяет истинность условия, и если условие истинно, то код цикла выполняется (может не выполнится ни разу)

do..while - сначала выполняется код цикла, а потом происходит проверка условия в инструкции while. И пока это условие истинно, цикл повторяется (обязательно выполнится минимум 1 раз)

continue, break, return, goto

операторы перехода

continue - начинает новую итерацию ближайшего внешнего цикла
break - завершает выполнение ближайшего внешнего цикла (или switch)
return - завершает выполнение метода, в котором он присутствует, и возвращает управление и результат функции (при его наличии) вызывавшему методу
goto - передает управление оператору, помеченному специальной меткой

ссылка - документация майкрософт

new, var, base, this, where, default, yield 

операторы и ключевые слова

new - создает экземпляр типа
ссылка - документация майкрософт

var - неявно типизированная локальная переменная
ссылка - документация майкрософт

base
-  используется для вызова в дочернем классе (из переопределенного метода) метода родительского класса и/или для вызова родительского конструктора из дочернего
ссылка - документация майкрософт

this - ссылается на текущий экземпляр класса
ссылка - документация майкрософт

where - ограничения на типы для универсальных типов (generic)
ссылка - документация майкрософт

default - значения по умолчанию для типов
ссылка - документация майкрософт

yield
 - обозначение итератора для перебора набора значений. Данный блок кода может представлять тело метода, оператора или блок get в свойствах
ссылка - объяснение и примеры
ссылка - документация майкрософт

is, as, typeof

идентификация типов

is - проверяет, совпадает ли тип выражения с заданным типом данных
as - предназначен для избегания возникновения исключительной ситуации в случае неудачного приведения типов
ссылка - объяснение и примеры

typeof - используется для получения информации о заданном типе (классе)
ссылка - документация майкрософт

ref, out, in,

модификаторы передачи параметров

По умолчанию параметры передаются в метод по значению (то есть создаются новые в области памяти). Передача по ссылке - ссылается на "оригинальное" место в памяти.

ref - передача входного параметра по ссылке. Метод получает адрес переменной в памяти. И, таким образом, если в методе изменяется значение параметра, передаваемого по ссылке, то также изменяется и значение переменной, которая передается на его место
ссылка - документация майкрософт

out - параметр на выход по ссылке. Методы, использующие такие параметры, обязательно должны присваивать им определенное значение. По сути можно вернуть из метода не одно значение, а несколько
ссылка - некоторые примеры с объяснением
ссылка - документация майкрософт

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

ссылка - объяснение и примеры (про все три модификатора)

enum, switch

перечисление и переключатель

enum - (тип перечисление) представляет собой набор символьных имен, связанных с уникальными целочисленными значениями
ссылка - описание с примерами
ссылка - документация майкрософт

switch - обеспечивает много направленное ветвление в программе (замена if/else). Этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы. В некоторых случаях оператор выбора switch может иметь более эффективное использование чем использование вложенных операторов if
ссылка - много примеров
ссылка - документация майкрософт

delegate, event, unityEvent, unityAction

события

delegate (делегат) - представляет собой объект, который может ссылаться на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод (или методы), на который он ссылается
ссылка - описание с примерами

event (событие)
- это сообщение, посланное объектом, чтобы уведомить о совершении действия. Это действие может быть вызвано пользовательским взаимодействием, например нажатием кнопки, или какой-то другой программной логикой, например изменением значения свойства. Объект, вызывающий событие, называется отправителем событий. Отправителю событий не известен объект или метод, который будет получать (обрабатывать) созданные им события. Во избежание ошибок при вызове, нужно отписываться вручную
ссылка - подробно с примером

unityEvent - встроенные события в юнити. Есть возможность подписываться через инспектор, позволяет не отписываться в ручную(происходит автоматически), но медленнее чем event/delegate
ссылка - документация юнити

unityAction - это встроенный делегат в юнити

built-in array (массив), queue (очередь), list (список), arrayList (массивСписок), dictionary (словарь), hashtable (хеш таблица), stack (стек)

коллекции (контейнеры)

"массив" - средство объединения однотипных переменных
Представленные ниже массивы отличаются по доступу к элементам (по индексу / по ключу), типизированные или нет и по скорости обработки запросов

built-in array (встроенный массив)
- типизированный, с фиксированной длиной, самый быстрый вариант массива. Может быть одномерным, многомерным или массивом массивов
ссылка - объяснение и примеры
ссылка - документация майкрософт

queue (очередь)  - это типизированная коллекция, добавление и удаление элементов в которой происходит путём операций push и pop. Реализуется принцип «первым вошел — первым вышел» (англ. first-in, first-out — FIFO). У очереди имеется голова (англ. head) и хвост (англ. tail). Когда элемент ставится в очередь, он занимает место в её хвосте. Из очереди всегда выводится элемент, который находится в ее голове
ссылка - объяснение и примеры

list (список) - типизированный, содержит объекты только одного типа; доступ к элементам по индексу; динамический, но можно задать размер изначально
ссылка - описание и примеры

arrayList (массивСписок) -
коллекция объектов; не типизированный - может содержать в себе одновременно разные типы - строки, числа, объекты, другие массивы и тд.; доступ к элементам по индексу; динамический размер
ссылка - описание и примеры

dictionary (словарь) -
типизированный; доступ к элементам по ключам (key - value); динамический размер
ссылка - описание и примеры

hashtable (хеш таблица) -  не типизированный словарь - может содержать в себе одновременно разные типы; доступ к элементам по ключам (key - value); динамический размер. При добавлении элементов в хэш-таблицу автоматически создается хэш-код. Этот код скрыт от разработчика. Главным преимуществом структуры хэш-таблиц является возможность быстрого поиска элементов, даже в огромных наборах данных
ссылка - описание и примеры

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

observableCollection, bitArray, linkedList, sortedList, bindingList

еще коллекции

observableCollection - по функциональности коллекция похожа на List за тем исключением, что позволяет известить внешние объекты о том, что коллекция была изменена
ссылка - описание и примеры

bitArray - массив двоичных значений, представленных логическими значениями true или false
ссылка - документация майкрософт

linkedList (двухсвязный список) - каждый элемент хранит ссылку одновременно на следующий и на предыдущий элемент. Удобен когда важно быстродействие вставка/удаление элементов в начало или конец списка
ссылка - описание и примеры
ссылка - подробное описание методов списка с картинками

sortedList - типизированный список; доступ к элементам по ключам (key - value);
сортирует элементы на основе значения ключа
ссылка - документация майкрософт

bindingList - коллекция, которая поддерживает привязку данных
ссылка - документация майкрософт

IEnumerable, IEnumerator, IQueryable

интерфейсы перебора объектов

IEnumerable - интерфейс, для перебора объектов с цикле, реализуется в большинстве коллекций. Имеет метод, возвращающий ссылку на IEnumerator
IEnumerator - интерфейс, определяет функционал для перебора внутренних объектов в контейнере
ссылка - объяснение и примеры

IQueryable - интерфейс, наследуется от IEnumerable, позволяет работать с удаленными источниками данных (например база данных на сервере) более эффективно
ссылка - различие между IQueryable и IEnumerable

boxing, unboxing

преобразование типов

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

boxing (упаковка) - Когда любой значимый тип (value type) присваивается к ссылочному типу (reference type) данных, значение перемещается из области стека в кучу. Упаковка является неявной
unboxing (распаковка) - когда любой ссылочный тип присваивается к значимому типу данных, значение перемещается из области кучи в стек. Распаковка является явной
ссылка - описание и примеры
ссылка - документация майкрософт

generic, Nullable

обобщение и допуск значения null

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

Nullable
- обычные типы значений не могут иметь значение null. Но вы можете создать специальные типы, допускающие значения NULL, добавив символ "?" после имени типа. Например, тип int? является типом int, который может иметь значение null. Типы, допускающие значение NULL, представляют собой экземпляры универсального типа структуры System.Nullable<T>. Типы, допускающие значение NULL, особенно полезны при передаче данных в базы данных, где могут использоваться числовые значения null, и из таких баз данных. Дополнительные сведения см. в разделе Типы, допускающие значение NULL
ссылка - объяснение и примеры

try, catch, finally, throw

перехват ошибочных условий

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

final, finally, Finalize

это финал

final - в С# нет ключевого слова final, его заменяют sealed и readonly
В С++ используется для обозначения виртуальных функций, которые нельзя переопределить в производном классе или для назначения классов, которые невозможно наследовать
ссылка - (С++) документация майкрософт


finally
- последний блок из try - catch - finally

Finalize
- позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора
ссылка - объяснение и пример
ссылка - документация майкрософт

Если нашел ошибку или есть более простое описание термина или знаешь какие термины стоит добавить или любое другое предложение/замечание - буду рад комментарию.

Tags:
Hubs:
Total votes 17: ↑6 and ↓11-5
Comments17

Articles