Создание класса или типа в Visual Studio
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Область применения этого формирования кода:
Что? Этот компонент позволяет немедленно создавать код для класса или типа.
Когда? Вы представляете новый класс или тип и автоматически правильно объявляете его.
Зачем? Вы можете объявить класс или тип перед их использованием, но эта функция позволяет создать класс или тип автоматически.
Практические советы
- Поместите курсор в строку с красной волнистой линией. Она указывает несуществующий класс.
- C#:

- Visual Basic:

- C#:
- Затем выполните одно из следующих действий.
- Клавиатура
- Нажмите CTRL+., чтобы открыть меню Быстрые действия и рефакторинг.
- Мышь
- Щелкните правой кнопкой мыши и выберите меню Быстрые действия и рефакторинг.
- Наведите указатель мыши на красную волнистую линию и щелкните появившийся значок
. - Щелкните появившийся значок
, который отображается в левом поле, если текстовый курсор уже находится в строке выбора с красной волнистой линией.
- Клавиатура

- Создание класса TypeName в новом файле— создает класс TypeName в файле с именемTypeName.cs/.vb.
- Создание класса TypeName— создает класс с именем TypeName в текущем файле.
- Создайте вложенный класс TypeName— создает класс с именем TypeName, вложенный в текущий класс.
- Создание нового типа. — создает новый класс или структуру со всеми заданными свойствами.
Щелкните ссылку Просмотреть изменения в нижней части окна предварительного просмотра, чтобы просмотреть все будущие изменения, прежде чем выбрать элементы.

| Выбор | Description |
|---|---|
| Открыть | Задайте для этого типа доступ По умолчанию, Внутренний или Открытый. |
| Вид | Для этого параметра можно выбрать значения class или struct. |
| Имя | Это имя нельзя изменить. Будет использоваться имя, которое вы уже ввели. |
| Проект | Если решение содержит несколько проектов, вы можете выбрать проект, в котором будут находиться класс или структура. |
| Имя файла | Можно создать новый файл или добавить тип в существующий. |
Создается класс или структура. Для C# также создается конструктор.
- C#

- Visual Basic

См. также
- Создание кода
- Просмотр изменений
Классы, структуры и пространства имен
C# является полноценным объектно-ориентированным языком. Это значит, что программу на C# можно представить в виде взаимосвязанных взаимодействующих между собой объектов.
Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.
В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.
По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :
class название_класса < // содержимое класса >
После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:
class Person

Однако такой класс не особо показателен, поэтому добавим в него некоторую функциональность.
Поля и методы класса
Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса — это переменные, определенные на уровне класса.
Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.
Итак, добавим в класс Person поля и методы:
class Person < public string name = "Undefined"; // имя public int age; // возраст public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .
При определении полей мы можем присвоить им некоторые значения, как в примере выше в случае переменной name . Если поля класса не инициализированы, то они получают значения по умолчанию. Для переменных числовых типов это число 0.
Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .
Создание объекта класса
После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы . По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:
new конструктор_класса(параметры_конструктора);
Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .
Конструктор по умолчанию
Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.
Теперь создадим объект класса Person:
Person tom = new Person(); // создание объекта класса Person // определение класса Person class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.
Обращение к функциональности класса
Для обращения к функциональности класса — полям, методам (а также другим элементам класса) применяется точечная нотация точки — после объекта класса ставится точка, а затем элемент класса:
объект.поле_класса объект.метод_класса(параметры_метода)
Например, обратимся к полям и методам объекта Person:
Person tom = new Person(); // создание объекта класса Person // Получаем значение полей в переменные string personName = tom.name; int personAge = tom.age; Console.WriteLine($"Имя: Возраст "); // Имя: Undefined Возраст: 0 // устанавливаем новые значения полей tom.name = "Tom"; tom.age = 37; // обращаемся к методу Print tom.Print(); // Имя: Tom Возраст: 37 class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
Консольный вывод данной программы:
Имя: Undefined Возраст: 0 Имя: Tom Возраст: 37
Добавление класса
Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. Если мы работаем над проектом вне среды Visual Studio, используя .NET CLI, то нам достаточно добавить новый файл класса в папку проекта. Например, добавим новый файл, который назовем Person.cs и в котором определим следующий код:
class Person < public string name = "Undefined"; public void Print() < Console.WriteLine($"Person "); > >
Здесь определен класс Person с одним полем name и методом Print.
В файле Program.cs , который представляет основной файл программы используем класс Person:
Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom

Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса. Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )
В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса — пусть он будет назваться Person :

В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс, в котором можно определить тот же код и также использовать в файле Program.cs.
Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.
Урок #14 – Создание классов и объектов

Мы с вами приступаем к практической реализации ООП. За урок мы научимся прописывать классы и объекты в языке программирования C#. Нами будет создан класс для описания робота.
Видеоурок
Создание классов
Для создания класса необходимо прописать ключевое слово class и далее название для класса. Общепринято начинать названия классов с буквы в верхнем регистре, но если этого не сделать, то ошибки не будет.
В любом классе можно создавать поля (переменные), методы (функции), а также конструкторы.
Создав новый класс и поместив туда какую-либо информацию мы можем создавать на основе него новые объекты. Объекты будут иметь доступ ко всем характеристикам класса, которые отмечены модификатором public .
Существует три модификатора доступа:
- public — данные будут видны повсюду, как в классе, так и вне его;
- protected — данные будут видны только в классе, где они были созданы, а также в классах наследниках;
- private — данные будут видны только в классе, где они были созданы.
Пример простого класса приведен ниже:
class Book < public int pages; public string name; public float weight; public void getInfoBook () < Console.WriteLine("В книге " + name + " находиться " + pages + " страниц. "); Console.WriteLine("При этом она весит " + weight); >>
На основе такого класса мы можем создать множество объектов. Каждый объект в данном случае будет представлять из себя конкретную книжку. Для каждого объекта мы можем указать уникальные данные: количество страниц, название книги и её вес.
Чтобы создать объект нам потребуется следующий код:
Book sherlock_holms; // объявление переменной sherlock_holms = new Book(); // выделение памяти под объект Book sherlock_holms.getInfoBook();
Такой код можно прописать и в одной строке кода. Мы для наглядности разбили код в две строки.
Чтобы брать данные из класса через объект необходимо ставить точку и указывать имя переменной или функции, которую мы хотим взять.
Весь код будет доступен после подписки на проект!
Работа с кодом С++ в Конструкторе классов
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Конструктор классов отображает визуальную область конструктора, которая называется диаграммой классов и предоставляет визуальное преставление элементов кода в проекте. Схемы классов можно использовать для разработки и визуализации классов и других типов в проекте.
Конструктор классов поддерживает следующие элементы кода C++:
- Класс (похож на фигуру управляемого класса, за исключением того, что он может иметь несколько отношений наследования)
- Анонимный класс (отображает созданное представлением класса имя для анонимного типа)
- Класс шаблона
- Структура
- Перечисление
- Макрос (отображает представление макроса после обработки)
- Typedef
Это не аналог схемы классов UML, которую можно создать в проекте моделирования. Дополнительные сведения см. в разделе UML-схемы классов: справочник.
Классы проектирования C++ в конструкторе классов
Конструктор классов поддерживает классы C++ и визуализирует собственные классы C++ так же, как фигуры классов Visual Basic и C#. Отличие состоит в том, что классы C++ могут обладать отношениями множественного наследования. Фигуру класса можно развернуть, чтобы отобразить дополнительные поля и методы класса, а также свернуть в целях экономии места.
Конструктор классов не поддерживает объединения (это особый тип класса, в котором объем выделяемой памяти равен размеру самого большого элемента данных объединения).
Простое наследование
Если перетащить на схему сразу несколько классов, между которыми есть отношение наследования, они будут соединены стрелкой. Стрелка указывает в направлении базового класса. Например, если на схеме классов отображаются следующие классы, они будут соединены стрелкой, которая будет указывать от класса B на класс A:
class A <>; class B : A <>;
Также можно перетащить на схему только класс B, щелкнуть правой кнопкой мыши его фигуру, а затем выбрать команду Показать базовые классы. В этом случае будет показан базовый класс A.
Множественное наследование
Конструктор классов поддерживает наглядное представление отношений множественного наследования. Множественное наследование используется, если у производного класса есть атрибуты более чем одного базового класса. Ниже приведен пример множественного наследования:
class Bird <>; class Swimmer <>; class Penguin : public Bird, public Swimmer <>;
Если перетащить на схему сразу несколько классов, между которыми есть отношение множественного наследования, они будут соединены стрелкой. Стрелка указывает в направлении базовых классов.
Чтобы просмотреть классы, которые являются базовыми для выбранного, щелкните правой кнопкой мыши фигуру класса и выберите Показать базовые классы.
Команда Показать производные классы в коде C++ не поддерживается. Чтобы просмотреть производные классы, перейдите в представление классов, разверните узел типа, затем разверните вложенную папку Производные типы и перетащите нужные типы на диаграмму классов.
Дополнительные сведения о множественном наследовании классов см. в разделах Множественное наследование и Несколько базовых классов.
Абстрактные классы
Конструктор классов поддерживает абстрактные классы (также называются «абстрактными базовыми классами»). Для этих классов не создаются экземпляры, но от них могут наследоваться другие классы. Используя пример из раздела «Множественное наследование» этого документа, вы можете создавать экземпляры класса Bird в виде отдельных объектов, как показано ниже:
int main()
Тем не менее вы не можете создавать экземпляры класса Swimmer в виде отдельных объектов. При этом вы можете создавать на его основе производные классы, например Penguin , Whale и Fish . В этом случае можно объявить Swimmer как абстрактный базовый класс.
Чтобы объявить класс как абстрактный, используйте ключевое слово abstract . Элементы, помеченные как абстрактные или включенные в абстрактный класс, являются виртуальными и должны быть реализованы классами, производными от абстрактного класса.
class Swimmer abstract < virtual void swim(); void dive(); >;
Также можно объявить класс как абстрактный, включив по крайней мере одну чисто виртуальную функцию:
class Swimmer < virtual void swim() = 0; void dive(); >;
При выводе этих объявлений на схеме классов имена класса Swimmer и его чисто виртуальной функции swim отображаются курсивом на фигуре абстрактного класса. Кроме того, будет показана надпись Абстрактный класс. Обратите внимание, что фигуры типа абстрактного класса аналогичны обычным классам, но их границы показаны пунктирной линией.
В классе, производном от абстрактного базового класса, необходимо переопределить каждую чисто виртуальную функцию в базовом классе. В противном случае создать экземпляр производного класса нельзя. Например, если необходимо наследовать класс Fish от класса Swimmer , в классе Fish необходимо переопределить метод swim :
class Fish : public Swimmer < void swim(int speed); >; int main()
При отображении данного кода на диаграмме классов конструктор классов проводит линию наследования от класса Fish к классу Swimmer .
Анонимные классы
Конструктор классов поддерживает анонимные классы. Типы анонимных классов объявляются без идентификатора. Они не могут иметь конструктор или деструктор, не могут передаваться в качестве аргументов в функции и не возвращаются в качестве значений из функций. Анонимный класс можно использовать для замены имени класса именем определения типа, как показано в следующем примере:
typedef struct < unsigned x; unsigned y; >POINT;
Структуры также могут быть анонимными. Конструктор классов отображает анонимные классы и структуры таким же образом, как и соответствующие типы. Несмотря на то, что можно объявить и отобразить анонимные классы и структуры, конструктор классов не будет использовать указанное имя тега. В этом случае будет использоваться имя, созданное в представлении классов. Класс или структура отображаются в представлении классов и конструкторе классов в виде элемента с именем __unnamed.
Дополнительные сведения об анонимных классах см. в разделе Типы анонимных классов.
Классы шаблона
Конструктор классов поддерживает визуализацию классов шаблона. Поддерживаются вложенные объявления. В следующей таблице показаны некоторые типичные объявления.
В следующей таблице показаны некоторые примеры частичной специализации.
В следующей таблице показаны некоторые примеры наследования в частичной специализации.
(указывает на класс A)
В следующей таблице приведены некоторые примеры функций шаблона частичной специализации.
void func(T a, U b);
void func(T a, int b);
В следующей таблице показаны некоторые примеры наследования шаблонов.
(Класс B содержится в классе C в разделе Вложенные типы)
В следующей таблице показаны некоторые примеры связей между классами в канонической специализации.
Перечисления C++ в конструкторе классов
Конструктор классов поддерживает типы C++ enum и типы enum class с областью видимости. Ниже приведен пример:
enum CardSuit < Diamonds = 1, Hearts = 2, Clubs = 3, Spades = 4 >; // or. enum class CardSuit < Diamonds = 1, Hearts = 2, Clubs = 3, Spades = 4 >;
Фигура перечисления C++ в схеме классов выглядит и работает подобно фигуре структуры, за исключением того, что она называется Перечисление или Класс перечисления, имеет розовый, а не синий цвет, и располагает цветной границей на левом и верхнем полях. Фигуры перечисления и структуры имеют прямые углы.
Дополнительные сведения об использовании типа enum см. в статье Enumerations (Перечисления).
Определения типов C++ в конструкторе классов
Операторы typedef создают один или несколько уровней косвенного обращения между именем и его базовым типом. Конструктор классов поддерживает те определения типов C++, которые объявлены с ключевым словом typedef , например:
typedef class coord < void P(x,y); unsigned x; unsigned y; >COORD;
Затем можно использовать этот тип для объявления экземпляра:
Фигуры для классов и структур
В конструкторе классов определение типа C++ имеет форму типа, указанного в определении типа. Если источник объявляет typedef class , у фигуры будут скругленные углы и метка класса. У typedef struct фигура имеет квадратные углы и метку Структура.
Классы и структуры могут иметь вложенные определения типов, объявленные внутри них. В конструкторе классов фигуры классов и структур могут отображать вложенные объявления определений типов в виде вложенных фигур.
Фигуры определения типов поддерживают команды Показывать как ассоциацию и Показывать как ассоциацию наборов контекстного меню.
Пример определения типа класса
class B <>; typedef B MyB;

Пример определения типа структуры
typedef struct mystructtag < int i; double f; >mystruct;

Неименованные определения типов
Несмотря на то, что можно объявить определение типа без имени, конструктор классов не будет использовать указываемое имя тега. Конструктор классов будет использовать имя, созданное в представлении классов. Например, следующее объявление является допустимым, но оно отображается в представлении классов и конструкторе классов как объект с именем __unnamed:
typedef class coord < void P(x,y); unsigned x; unsigned y; >;
Конструктор классов не отображает определение типа, если его исходный тип является указателем на функцию.
Сведения об ограничениях для элементов кода C++
- При загрузке проекта на С++ конструктор классов работает в режиме только для чтения. Вы можете изменить схему классов, но не можете сохранить изменения из схемы классов обратно в исходный код.
- Конструктор классов поддерживает только собственную семантику C++. Для проектов C++, которые компилируются в управляемый код, конструктор классов будет визуализировать только те элементы кода, которые являются собственными типами. Таким образом, вы можете добавить диаграмму классов в проект, но конструктор классов не позволит визуализировать элементы, в которых свойству IsManaged задано значение true (то есть типы значений и ссылочные типы).
- Для проектов C++ конструктор классов считывает только определение типа. Например, предположим, что вы определяете тип в файле заголовков (H) и определяете его члены в файле реализации (CPP). При выполнении команды «Просмотр схемы класса» для файла реализации (CPP) конструктор класса не отображает ничего. Еще один пример, если вы выполняете команду «Просмотр схемы класса» для CPP-файла, который использует оператор #include для включения других файлов, но не содержит фактические определения классов, конструктор класса снова не отображает ничего.
- IDL-файлы, которые определяют COM-интерфейсы и библиотеки типов, не отображаются в схемах, пока не будут скомпилированы в машинный код C++.
- Конструктор классов не поддерживает глобальные функции и переменные.
- Конструктор классов не поддерживает объединения. Это особый тип класса, в котором объем выделяемой памяти равен размеру самого большого элемента данных объединения.
- int Конструктор классов char не отображает базовые типы данных, такие как и .
- Конструктор классов не отображает типы, которые определены за пределами текущего проекта, если только проект не содержит правильные ссылки на эти типы.
- Конструктор классов может отобразить вложенные типы, но не отношения между вложенным типом и другими типами.
- Конструктор классов не может отобразить типы, которые относятся к void или являются производными от типа void.
Устранение неполадок при разрешении типов и отображение проблем
Расположение исходных файлов
Конструктор классов не отслеживает расположение исходных файлов. Таким образом, при изменении структуры проекта или перемещении исходных файлов в проекте конструктор классов может потерять тип (особенно исходный тип определения типа, базовых классов или типов связи). Может возникнуть ошибка, например Конструктору классов не удалось отобразить этот тип. В этом случае перетащите измененный или перемещенный исходный код в схему классов и повторно отобразите ее.
Проблемы с обновлением и производительностью
Для проектов Visual C++ для отображения изменения в исходном файле на схеме классов может потребоваться от 30 до 60 секунд. Из-за такой задержки конструктор классов может выдать ошибку В выбранном блоке не найдены типы. После возникновения подобной ошибки нажмите кнопку Отмена в сообщении об ошибке и дождитесь отображения элемента кода в представлении классов. После этого конструктор классов должен быть в состоянии отобразить этот тип.
Если схема классов не обновляется для вывода внесенных в код изменений, может потребоваться закрыть схему и снова открыть ее.
Проблемы разрешения типа
Конструктор классов может оказаться не в состоянии разрешить типы по следующим причинам:
- Тип находится в проекте или сборке, на которые нет ссылок из проекта, содержащего эту схему классов. Чтобы исправить эту ошибку, добавьте ссылку на проект или сборку, содержащие данный тип. Дополнительные сведения см. в статье Управление ссылками в проекте.
- Тип находится в неправильной области действия, поэтому конструктор классов не может его найти. Убедитесь, что в коде присутствует оператор using , imports или #include . Убедитесь также, что этот тип (или связанный тип) не был перемещен из пространства имен, в котором он находился изначально.
- Тип не существует (или был закомментирован). Чтобы исправить эту ошибку, убедитесь, что тип не закомментирован и не удален.
- Тип находится в библиотеке, на которую ссылается директива #import. В качестве возможного обходного пути можно вручную добавить сформированный код (TLH-файл) в директиву #include в файле заголовка.
- Убедитесь, что конструктор классов поддерживает введенный вами тип. См . ограничения для элементов кода C++.
Скорее всего, проблема разрешения типов возникает, если код не найден для одной или нескольких фигур в схеме классов «». Это сообщение об ошибке не обязательно означает, что код содержит ошибку. Оно указывает лишь на то, что конструктору классов не удалось отобразить код. Попробуйте сделать следующее.
- Убедитесь, что тип существует. Убедитесь, что исходный код не был случайно закомментирован или удален.
- Попытайтесь разрешить тип. Тип может находиться в проекте или сборке, на которые нет ссылок из проекта, содержащего эту схему классов. Чтобы исправить эту ошибку, добавьте ссылку на проект или сборку, содержащие данный тип. Дополнительные сведения см. в статье Управление ссылками в проекте.
- Убедитесь, что тип находится в правильной области действия, чтобы конструктор классов мог его найти. Убедитесь, что в коде присутствует оператор using , imports или #include . Убедитесь также, что этот тип (или связанный тип) не был перемещен из пространства имен, в котором он находился изначально.
Дополнительные сведения об устранении неполадок см. в разделе об ошибках конструктора классов.
