Обзор классов, структур и записей в C #

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

Инкапсуляция

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

Участники

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

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

  • Поля
  • Константы
  • Свойства
  • Методы
  • Конструкторы
  • События
  • Методы завершения
  • Индексаторы
  • Операторы
  • Вложенные типы

Дополнительные сведения см. в разделе "Участники".

Специальные возможности

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

По умолчанию используется режим доступа private.

Наследование

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

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

Дополнительные сведения см. в статьях о наследовании и полиморфизме.

Интерфейсы

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

Универсальные типы

Для класса, структуры или записи можно определить один параметр типа или несколько. Клиентский код назначает тип при создании экземпляра типа. Например, класс List<T> в пространстве имен System.Collections.Generic определен с помощью одного параметра типа. Клиентский код создает экземпляр List<string> или List<int>, информируя о том, сущности какого типа будут храниться в этом списке. Дополнительные сведения см. в статье Универсальные шаблоны.

Статические типы

Классы (но не структуры или записи) могут быть объявлены как static. Статический класс может содержать только статические элементы. Для него нельзя создать экземпляр с помощью ключевого слова new. При запуске программы в память загружается одна копия такого класса. Доступ к его членам осуществляется через имя класса. Классы, структуры и записи могут содержать статические элементы. Дополнительные сведения см. в разделе Статические классы и члены статических классов.

Вложенные типы

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

Разделяемые типы

Вы можете разделить определение класса, структуры или метода на несколько файлов с кодом. Дополнительные сведения см. в статье Разделяемые классы и методы.

Инициализаторы объектов

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

Анонимные типы

В некоторых ситуациях нет смысла или пользы создавать именованный класс. В таких случаях можно использовать анонимные типы. Анонимные типы определяются их именованными элементами данных. Дополнительные сведения см. в разделе Анонимные типы.

Методы расширения

Вы можете "расширить" класс, даже не создавая производного класса. Для этого можно создать отдельный тип и вызывать его методы так, как если бы они принадлежали исходному типу. Дополнительные сведения см. в разделе "Методы расширения").

Неявно типизированные локальные переменные

Внутри метода класса или структуры можно использовать неявное типизирование, чтобы компилятор самостоятельно определял тип переменной во время компиляции. Дополнительные сведения см. в var (справочник по C#).

Записи

В C# 9 появился тип record, ссылочный тип, который можно создать вместо класса или структуры. Записи — это классы со встроенным поведением для инкапсуляции данных в неизменяемых типах. В C# 10 представлен новый тип значения record struct. Запись (record class или record struct) предоставляет следующие возможности:

  • краткий синтаксис для создания ссылочного типа с неизменяемыми свойствами;
  • равенство значений. Две переменные типа записи равны, если у них одинаковые типы и равные значения в каждом поле обеих записей. Классы используют равенство ссылок: две переменные типа класса равны, если они ссылаются на один и тот же объект.
  • Краткий синтаксис для обратимого изменения. Выражение with позволяет создать новый экземпляр записи, который является копией существующего экземпляра, но в котором изменены значения указанных свойств.
  • Встроенное форматирование для отображения. Метод ToString выводит имя типа записи, а также имена и значения общих свойств.
  • Поддержка иерархий наследования в классах записей. Классы записей поддерживают наследование. Структуры записей не поддерживают наследование.

Дополнительные сведения см. в статье Записи.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.