Классы и структуры (Руководство по программированию в C#)
Классы и структуры являются двумя основными конструкциями системы общих типов CTS в платформе .NET Framework. Каждая по сути является структурой данных, инкапсулирующей набор данных и поведение, связанные как логическая единица. Данные и поведение являются членами класса или конструкции, и в них включены методы, свойства, события и т.д., как описано далее в этом разделе.
Объявление класса или структуры подобно чертежу, который используется для создания экземпляров или объектов во время выполнения. При определении класса или структуры с именем Person, Person является именем типа. При объявлении или инициализации переменной p типа Person, p считается объектом или экземпляром Person. Возможно создание нескольких экземпляров одного типа Person, и каждый экземпляр может иметь разные значения в своих свойствах и полях.
Класс является ссылочным типом. При создании объекта класса переменная, к которой назначается объект, сохраняет только ссылку на память. При назначении ссылки на объект к новой переменной новая переменная ссылается на исходный объект. Изменения, внесенные через одну переменную, отображаются в другой переменной, поскольку обе они ссылаются на одни данные.
Структура является типом значения. При создании структуры переменная, к которой она назначается, сохраняет фактические данные структуры. При назначении структуры новой переменной выполняется ее копирование. Поэтому новая переменная и исходная переменная содержат две отдельных копии одних данных. Изменения, внесенные в одну копию, не влияют на другую копию.
В целом, классы используются для моделирования более сложного поведения, или же создаются данные, предназначенные для изменения после объекта класса. Структуры лучше всего подходят для небольших структур данных, которые содержат преимущественно те данные, которые не предназначены для изменения после создания структуры.
Дополнительные сведения см. в разделах Классы (Руководство по программированию на C#), Объекты (Руководство по программированию на C#) и Структуры (Руководство по программированию на C#).
Пример
В следующем примере на верхнем уровне пространства имен ProgrammingGuide определен класс MyCustomClass, содержащий три члена. Экземпляр (объект) класса MyCustomClass создается в методе Main класса Program, а для доступа к методам и свойствам используется точечная нотация.
namespace ProgrammingGuide
{
// Class definition.
public class MyCustomClass
{
// Class members:
// Property.
public int Number { get; set; }
// Method.
public int Multiply(int num)
{
return num * Number;
}
// Instance Constructor.
public MyCustomClass()
{
Number = 0;
}
}
// Another class definition. This one contains
// the Main method, the entry point for the program.
class Program
{
static void Main(string[] args)
{
// Create an object of type MyCustomClass.
MyCustomClass myClass = new MyCustomClass();
// Set the value of a public property.
myClass.Number = 27;
// Call a public method.
int result = myClass.Multiply(4);
}
}
}
Инкапсуляция
Об инкапсуляции иногда говорят как о первом базовом элементе или принципе объектно-ориентированного программирования. Согласно принципу инкапсуляции класс или структура может задать уровень доступности каждого из членов по отношению к коду вне класса или структуры. Методы и переменные, которые не предназначены для использования вне класса или сборки, могут быть скрыты, чтобы ограничить потенциальную угрозу возникновения ошибок кода или вредоносное использование.
Дополнительные сведения о классах см. в разделах Классы (Руководство по программированию на C#) и Объекты (Руководство по программированию на C#).
Члены
Все методы, поля, константы, свойства и события должны быть объявлены внутри типа; они называются членами типа. В C# не существует глобальных переменных или методов, как в некоторых других языках. Даже точка входа программы, метод Main, должен быть объявлен внутри класса или структуры. В следующем списке перечислены все возможные типы членов, которые можно объявлять в классе или в структуре.
Специальные возможности
Некоторые методы и свойства предназначены для вызова или доступа из кода вне класса или структуры, известной как клиентский код. Другие методы и свойства могут использоваться только в самом классе или структуре. Важно ограничить доступность кода, чтобы он был доступен только предназначенному клиентскому коду. Пользователь задает доступность типов и их членов для клиентского кода с помощью модификаторов доступа public, protected, internal, protected internal и private. Уровнем доступности по умолчанию является private. Для получения дополнительной информации см. Модификаторы доступа (Руководство по программированию в C#).
Наследование
Классы (но не структуры) поддерживают наследование. Класс, производный от другого (базового класса), автоматически включает все открытые, защищенные и внутренние члены базового класса, за исключением конструкторов и деструкторов. Дополнительные сведения см. в разделах Наследование (Руководство по программированию на C#) и Полиморфизм (Руководство по программированию на C#).
Классы можно определять как абстрактные (abstract), что будет означать, что один или несколько их членов не имеют реализации. Явным образом создавать экземпляры абстрактных классов невозможно, но эти классы можно использовать в качестве базовых для других классов, в которых недостающие элементы будут реализованы. Классы также могут объявляться запечатанными (sealed), чтобы от них нельзя было наследовать новые классы. Для получения дополнительной информации см. Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#).
Интерфейсы
Классы и структуры способны наследовать различным интерфейсам. Наследование интерфейсу означает, что в этом типе реализованы все методы, определенные в интерфейсе. Для получения дополнительной информации см. Интерфейсы (Руководство по программированию в C#).
Универсальные типы
Классы и структуры можно определять с одним или несколькими параметрами типов. Тип указывается в клиентском коде при создании экземпляра данного типа. Например, класс List пространства имен System.Collections.Generic определен с одним параметром. При создании экземпляра List<string> или List<int> указывается тип значений, которые можно будет хранить в этом списке. Для получения дополнительной информации см. Универсальные шаблоны (Руководство по программированию на C#).
Статические типы
Классы (но не структуры) могут объявляться статическими. Статический класс может содержать только статические члены, и с помощью ключевого слова new нельзя будет создать экземпляр такого класса. Одна копия такого класса загружается в память при запуске программы, и все методы этого класса становятся доступными по имени класса. Классы и структуры могут содержать статические члены. Для получения дополнительной информации см. Статические классы и члены статических классов (Руководство по программированию в C#).
Вложенные типы
Класс или структура может быть вложенной внутри другого класса или структуры. Дополнительные сведения см. в разделе Вложенные типы.
Разделяемые типы
Существует возможность определить часть класса, структуры или метода в одном файле кода, а другую часть —в другом файле кода. Дополнительные сведения см. в разделе Разделяемые классы и методы.
Инициализаторы объектов
Создавать экземпляры и инициализировать класс или объекты структуры, а также коллекции объектов можно без явного вызова соответствующего конструктора. Дополнительные сведения см. в разделе Инициализаторы объектов и коллекций (Руководство по программированию в C#).
Анонимные типы
В случаях, когда создавать именованный класс неудобно или не требуется, например при заполнении списка структурами данных, которые не нужно сохранять или передавать другому методу, используются анонимные типы. Дополнительные сведения см. в разделе Анонимные типы (Руководство по программированию в C#).
К методам расширения
Существует возможность расширять класс без создания производного класса. Для этого создается отдельный тип, к методам которого можно обращаться, как если бы они принадлежали исходному типу. Дополнительные сведения см. в разделе Методы расширения (Руководство по программированию в C#).
Неявно типизированные локальные переменные
Внутри метода класса или структуры можно использовать неявную типизацию, чтобы тип определялся во время компиляции. Дополнительные сведения см. в разделе Неявно типизированные локальные переменные (Руководство по программированию в C#).
Спецификация языка C#
Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.