Общие сведения о классах
Тип, определенный как , class является ссылочным типом. Во время выполнения при объявлении переменной ссылочного типа переменная содержит значение null , пока вы явно не создадите экземпляр класса с помощью new оператора или не назначите ему объект совместимого типа, который может быть создан в другом месте, как показано в следующем примере:
//Declaring an object of type MyClass. MyClass mc = new MyClass(); //Declaring another object of the same type, assigning it the value of the first object. MyClass mc2 = mc;
При создании объекта выделяется достаточный объем памяти для этого объекта в управляемой куче, и переменная хранит только ссылку на расположение данного объекта. Память, используемая объектом, освобождается с помощью функции автоматического управления памятью среды CLR, которая называется сборкой мусора. Дополнительные сведения о сборке мусора см. в разделе Автоматическое управление памятью и сборка мусора.
Объявление классов
Классы объявляются с помощью class ключевое слово за которым следует уникальный идентификатор, как показано в следующем примере:
//[access modifier] - [class] - [identifier] public class Customer < // Fields, properties, methods and events go here. >
Дополнительный модификатор class доступа предшествует ключевое слово. Так как public используется в этом случае, любой пользователь может создавать экземпляры этого класса. За именем класса следует ключевое слово class . Имя класса должно быть допустимым именем идентификатора C#. Оставшаяся часть определения — это тело класса, в котором задаются данные и поведение. Поля, свойства, методы и события в классе собирательно называются членами класса.
Создание объектов
Хотя они иногда используются взаимозаменяемо, класс и объект — это разные вещи. Класс определяет тип объекта, но сам по себе он не является объектом. Объект — это конкретная сущность, основанная на классе, которую иногда называют экземпляром класса.
Объекты можно создать с помощью new ключевое слово за которым следует имя класса, как показано ниже:
Customer object1 = new Customer();
При создании экземпляра класса ссылка на объект передается программисту. В предыдущем примере object1 представляет собой ссылку на объект, который основан на Customer . Эта ссылка ссылается на новый объект , но не содержит сами данные объекта. Фактически, можно создать ссылку на объект без создания собственно объекта:
Customer object2;
Не рекомендуется создавать ссылки на объекты, которые не ссылаются на объект, так как попытка получить доступ к объекту через такую ссылку завершается сбоем во время выполнения. Ссылку можно сделать для ссылки на объект, создав новый объект или назначив ему существующий объект, например:
Customer object3 = new Customer(); Customer object4 = object3;
В этом коде создаются две ссылки на объект, которые указывают на один и тот же объект. Таким образом, любые изменения объекта, выполненные посредством object3 , отражаются при последующем использовании object4 . Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.
Конструкторы и инициализация
В предыдущих разделах представлен синтаксис для объявления типа класса и создания экземпляра этого типа. При создании экземпляра типа необходимо убедиться, что его поля и свойства инициализированы полезными значениями. Существует несколько способов инициализации значений.
- Принятие значений по умолчанию
- Инициализаторы полей
- Параметры конструктора
- Инициализаторы объектов
Каждый тип .NET имеет значение по умолчанию. Как правило, это значение равно 0 для числовых типов и null для всех ссылочных типов. Вы можете использовать это значение по умолчанию, если это целесообразно в приложении.
Если значение по умолчанию .NET не является правильным, можно задать начальное значение с помощью инициализатора поля:
public class Container < // Initialize capacity field to a default value of 10: private int _capacity = 10; >
Вы можете потребовать, чтобы вызывающие стороны предоставляли начальное значение, определив конструктор , который отвечает за установку этого начального значения:
public class Container < private int _capacity; public Container(int capacity) =>_capacity = capacity; >
Начиная с C# 12, можно определить основной конструктор как часть объявления класса:
public class Container(int capacity)
Добавление параметров в имя класса определяет основной конструктор. Эти параметры доступны в теле класса, который включает его члены. Их можно использовать для инициализации полей или в любом другом месте, где они необходимы.
Вы также можете использовать модификатор required для свойства и разрешить вызывающим объектам использовать инициализатор объекта для задания начального значения свойства:
public class Person < public required string LastName < get; set; >public required string FirstName < get; set; >>
Добавление required ключевое слово требует, чтобы вызывающие объекты должны задавать эти свойства как часть new выражения:
var p1 = new Person(); // Error! Required properties not set var p2 = new Person() < FirstName = "Grace", LastName = "Hopper" >;
Наследование классов
Классы полностью поддерживают наследование, фундаментальный механизм объектно ориентированного программирования. При создании класса можно наследовать от любого другого класса, который не определен как sealed . Другие классы могут наследовать от класса и переопределять виртуальные методы класса. Кроме того, можно реализовать один или несколько интерфейсов.
При наследовании создается производный класс, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса, как показано далее:
public class Manager : Employee < // Employee fields, properties, methods and events are inherited // New Manager fields, properties, methods and events go here. >
Когда объявление класса включает базовый класс, оно наследует все члены базового класса, кроме конструкторов. Дополнительные сведения см. в разделе Наследование.
Класс в C# может напрямую наследовать только от одного базового класса. Однако поскольку базовый класс может сам наследовать от другого класса, класс может косвенно наследовать несколько базовых классов. Кроме того, класс может напрямую реализовать несколько интерфейсов. Дополнительные сведения см. в разделе Интерфейсы.
Класс можно объявить как abstract . Абстрактный класс содержит абстрактные методы, которые имеют определение сигнатуры, но не имеют реализации. Не удается создать экземпляр абстрактных классов. Они могут использоваться только через производные классы, реализующие абстрактные методы. В отличие от этого, запечатанный класс не позволяет другим классам наследоваться от него. Дополнительные сведения см. в статье Абстрактные и запечатанные классы и члены классов.
Определения классов можно разделить между различными исходными файлами. Дополнительные сведения см. в разделе Разделяемые классы и методы.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
#19 – Создание классов и объектов

За урок вы на практике изучите использование классов и объектов. Вы познакомитесь с C++ ООП, научитесь строить классы и объекты на их основе.
Видеоурок
Создание классов
Для создания класса необходимо прописать ключевое слово class и далее название для класса. Общепринято начинать названия классов с буквы в верхнем регистре, но если этого не сделать, то ошибки не будет.
В любом классе можно создавать поля (переменные), методы (функции), а также конструкторы.
Создав новый класс и поместив туда какую-либо информацию мы можем создавать на основе него новые объекты. Объекты будут иметь доступ ко всем характеристикам класса, которые отмечены модификатором public .
Существует три модификатора доступа:
- public — данные будут видны повсюду, как в классе, так и вне его;
- protected — данные будут видны только в классе, где они были созданы, а также в классах наследниках;
- private — данные будут видны только в классе, где они были созданы.
Пример простого класса приведен ниже:
class Book < public: int pages; char name; float weight; void getInfoBook () < cout >;
На основе такого класса мы можем создать множество объектов. Каждый объект в данном случае будет представлять из себя конкретную книжку. Для каждого объекта мы можем указать уникальные данные: количество страниц, название книги и её вес.
Чтобы создать объект нам потребуется следующий код:
Book sherlock_holms; // Создание объекта sherlock_holms.getInfoBook(); // Вызов метода класса
Такой код можно прописать и в одной строке кода. Мы для наглядности разбили код в две строки.
Чтобы брать данные из класса через объект необходимо ставить точку и указывать имя переменной или функции, которую мы хотим взять.
Создание классов
#include #include using namespace std; class Building < private: int year; string type; public: void set_data(int y, string t) < year = y; type = t; >void get_info() < cout >; int main() < setlocale(LC_ALL, "RU"); Building school; //school.type = "Школа"; //school.year = 2000; school.set_data(2000, "Школа"); school.get_info(); Building house; //house.type = "Дом"; //house.year = 2010; house.set_data(2010, "Дом"); house.get_info(); return 0; >
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Создание экземпляра класса
До сих пор мы работали с уже созданными .NET типами или объектами. Но с отражением мы можем создавать экземпляры и во время выполнения, зная имя класса, который мы хотим создать. Есть несколько способов сделать это, но я предпочитаю получить ссылку на конструктор, который я хочу использовать, вызвать его, а затем использовать возвращенное значение в качестве моего экземпляра. Вот пример того, как это сделать. Сначала код, потом я все объясню:
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace ReflectionTest < class Program < static void Main(string[] args) < Type testType = typeof(TestClass); ConstructorInfo ctor = testType.GetConstructor(System.Type.EmptyTypes); if(ctor != null) < object instance = ctor.Invoke(null); MethodInfo methodInfo = testType.GetMethod("TestMethod"); Console.WriteLine(methodInfo.Invoke(instance, new object[] < 10 >)); > Console.ReadKey(); > > public class TestClass < private int testValue = 42; public int TestMethod(int numberToAdd) < return this.testValue + numberToAdd; >> >
Я определил простой класс для тестирования этого, называемый TestClass. Он просто содержит личное поле и открытый метод. Метод возвращает значение частного свойства, к которому добавляется значение параметра. Теперь нам нужно создать новый экземпляр этого TestClass, вызвать TestMethod и вывести результат на консоль.
В этом примере мы можем позволить себе роскошь использовать typeof () непосредственно на TestClass, но в какой-то момент вам, возможно, придется сделать это исключительно с помощью имени нужного класса. В этом случае можно получить ссылку на него через сборку, в которой он объявлен, как показано в главе о типе.
Таким образом, со ссылкой на Тип класса мы запрашиваем конструктор по умолчанию с помощью метода GetConstructor (), передавая System.Тип.EmptyTypes в качестве параметра. В случае, если нам нужен конкретный конструктор, мы должны предоставить массив типов, каждый из которых определяет, какой параметр конструктора мы ищем.
Как только у нас есть ссылка на конструктор, мы просто вызываем метод Invoke () для создания нового экземпляра класса TestClass. Мы передаем null в качестве параметра для вызова (), так как мы не хотим указывать какие-либо параметры. Мы используем GetMethod (), вместе с именем метода, который мы хотим, чтобы получить функцию TestMethod (), а затем мы еще раз используем магию метода Invoke () для вызова этой функции. На этот раз нам нужно указать параметр в виде массива объектов. Мы делаем это на лету, указывая число 10 в качестве единственного параметра, который нам нужен, и затем выводим результат вызова метода. Все это благодаря магии отражения!
This article has been fully translated into the following languages:
Is your preferred language not on the list? Click here to help us translate this article into your language!
Урок #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();
Такой код можно прописать и в одной строке кода. Мы для наглядности разбили код в две строки.
Чтобы брать данные из класса через объект необходимо ставить точку и указывать имя переменной или функции, которую мы хотим взять.
Весь код будет доступен после подписки на проект!