4. public: публичный, общедоступный класс или
член класса. Такой член класса доступен из
любого места в коде, а также из других программ
и сборок
private: закрытый класс или член класса.
Представляет полную противоположность
модификатору public. Такой закрытый класс или
член класса доступен только из кода в том же
классе или контексте.
protected: такой член класса доступен из
любого места в текущем классе или в
производных классах.
4
5. internal: класс и члены класса с подобным
модификатором доступны из любого места кода в
той же сборке, однако он недоступен для других
программ и сборок (как в случае с
модификатором public).
protected internal: совмещает функционал двух
модификаторов. Классы и члены класса с таким
модификатором доступны из текущей сборки и из
производных классов.
5
12. Определение статических конструкторов
12
В отдельном классе может быть определен
только один статический конструктор
Не имеет модификатор доступа и не может
принимать параметры
Выполняется только один раз
C# является полноценным объектно-ориентированным языком, в данном языке программирования наиболее фундаментальной программной конструкцией является тип класса.
Формально класс – это определяемый пользователем тип, который состоит их полей данных (часто называемых переменными-членами) и членов, оперирующими эти данные (конструкторов, методов, событий). Все вместе поля данных представляют «состояние» экземпляра класса (иначе называемого объектом)
Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке - наличие двух рук, двух ног, головы, пищеварительной, нервной системы, головного мозга и т.д.
Есть некоторый шаблон - этот шаблон можно назвать классом. Реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.
Класс определяется с помощью ключевого слова Class. После определения типа класса нужно определить набор переменных-членов, которые будут использоваться для определения его состояния. Например, вы можете решить, что объект Car, должен иметь поле данных типа int, представляющее текущую скорость, и поле данных типа string для предоставления названия автомобиля. (Класс будет выглядеть следующим образом)
Все члены класса - поля, методы, свойства - все они имеют модификаторы доступа. Модификаторы доступа позволяют задать допустимую область видимости для членов класса. То есть контекст, в котором можно употреблять данную переменную или метод.
Полями класса называются обычные переменные уровня класса.
Константы
Особенностью констант является то, что их значение можно установить только один раз. Например, если у нас в программе есть некоторые переменные, которые не должны изменять значение (к примеру, число PI, число e и т.д.), мы можем объявить их константами.
Поля для чтения (readonly)
Поля для чтения можно инициализировать при их объявлении либо на уровне класса, либо инициализировать и изменять в конструкторе. Инициализировать или изменять их значение в других местах нельзя, можно только считывать их значение.
Свойства
Кроме обычных методов в языке C# предусмотрены специальные методы доступа, которые называются свойства. Они обеспечивает простой доступ к полям класса, узнать их значение или выполнить их установку.
Здесь у нас есть закрытое поле name и есть общедоступное свойство Name. Хотя они имеют практически одинаковое название за исключением регистра, но это не более чем стиль, названия у них могут быть произвольные и не обязательно должны совпадать.
Через это свойство мы можем управлять доступом к переменной name. Стандартное определение свойства содержит блоки get и set. В блоке get мы возвращаем значение поля, а в блоке set устанавливаем. Параметр value представляет передаваемое значение.
Возможно, может возникнуть вопрос, зачем нужны свойства, если мы можем в данной ситуации обходиться обычными полями класса? Но свойства позволяют вложить дополнительную логику, которая может быть необходима, например, при присвоении переменной класса какого-либо значения. Свойства управляют доступом к полям класса. Однако, что, если у нас с десяток и более полей, то определять каждое поле и писать для него однотипное свойство было бы утомительно. Начиная с версии C# 6.0 была добавлена такая функциональность, как инициализация автосвойств.
Автоматические свойства
Начиная с версии C# 3.0, появилась возможность для реализации очень простых свойств, не прибегая к явному определению переменной, которой управляет свойство. Вместо этого базовую переменную для свойства автоматически предоставляет компилятор. Такое свойство называется автоматически реализуемым.
Несмотря на очевидные удобства автоматически реализуемых свойств, их применение ограничивается в основном теми ситуациями, в которых не требуется управление установкой или получением значений из поддерживающих полей.
Инициализация автосвойств
Обратите внимание на то, что после обозначений аксессоров get и set сразу же следует точка с запятой, а тело у них отсутствует. Такой синтаксис предписывает компилятору создать автоматически переменную, иногда еще называемую поддерживающим полем, для хранения значения.
Выше мы посмотрели, что через свойства устанавливается доступ к приватным переменным класса.
Подобное сокрытие состояния класса от вмешательства извне представляет механизм инкапсуляции, который представляет одну из ключевых концепций объектно-ориентированного программирования. Применение модификаторов доступа типа private защищает переменную от внешнего доступа. Для управления доступом во многих языках программирования используются специальные методы, геттеры и сеттеры. В C# их роль, как правило, выполняют свойства.
https://metanit.com/sharp/tutorial/3.4.php
Кроме обычных методов в классах используются также и специальные методы, которые называются конструкторами.
Конструкторы вызываются при создании нового объекта данного класса. Отличительной чертой конструктора является то, что его название должно совпадать с названием класса.
Одно из назначений конструктора - начальная инициализация членов класса.
Конструктор это специальный метод класса, который вызывается неявно при создании объекта с использованием ключевого слова new. Конструктор НИКОГДА не не имеет возвращаемогозначения.
В языке C# имееться ключевое слова THIS, которое обеспечивает доступ к текущему экземпляру класса.
Второй пункт стр.191
Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.
Существуют различные контексты
Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса
Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны
Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не достуны.
Класс C# может определять любое количество статических членов, которые объявляются с помощью ключевого слова static. При этом соответствующий член должен вызываться непосредственно на уровне класса.
Проще говоря, статические члены – это элементы, задуманные как общие, так что нет нужды создавать экземпляр класса перед их вызовом.
Ключевое слово static может быть применено к следующим конструкциям:
Данные класса;
Методы класса;
Свойства класса;
Конструктор;
Целое определение класса;
https://habrahabr.ru/post/206082/
Стр198-199
В C# предусмотрена возможность определения статистического конструктора, который позволяет безопасно устанавливать значения статистических данных.
Параметры представляют собой переменные, которые определяются в сигнатуре метода и создаются при его вызове.
Существует два способа передачи параметров в метод в языке C#: по значению и по ссылке.
Наиболее простой способ передачи параметров представляет передача по значению. Данные значения еще называют аргументами.
Передача параметров по ссылке и модификатор ref
При передаче параметров по ссылке перед параметрами используется модификатор ref
В чем отличие двух способов передачи параметров? При передаче по значению метод получает не саму переменную, а ее копию. А при передаче параметра по ссылке метод получает адрес переменной в памяти. И, таким образом, если в методе изменяется значение параметра, передаваемого по ссылке, то также изменяется и значение переменной, которая передается на его место.
Модификатор out
Выше мы использовали входные параметры. Но параметры могут быть также выходными. Чтобы сделать параметр выходным, перед ним ставится модификатор out.
Причем, как и в случае с ref ключевое слово out используется как при определении метода, так и при его вызове.
Прелесть использования подобных параметров состоит в том, что по сути мы можем вернуть из метода не один вариант, а несколько.
Во всех предыдущих примерах мы использовали постоянное число параметров. Но, используя ключевое слово params, мы можем передавать неопределенное количество параметров
Частичные классы
Частичные классы (partial class) представляют возможность разделить функционал одного класса на несколько файлов. Например, сейчас у нас код класса Book весь находится в одном файле Book.cs. Но мы можем разделить весь код на несколько разных файлов. В этом случае нам надо будет поставить перед определением класса ключевое слово partial.
System.ValueTuple
Определение кортежей
Кортеж представляет набор значений, заключенных в круглые скобки: var tuple = (5, 10);
В данном случае определен кортеж tuple, который имеет два значения: 5 и 10. В дальнейшем мы можем обращаться к каждому из этих значений через поля с названиями Item[порядковый_номер_поля_в_кортеже].
Мы также можем дать названия полям кортежа
Кортежи могут передаваться в качестве параметров в метод, могут быть возвращаемым результатом функции, либо использоваться иным образом.
Например, одной из распространенных ситуаций является возвращение из функции двух и более значений, в то время как функция можно возвращать только одно значение. И кортежи представляют оптимальный способ для решения этой задачи