Общие сведения о классах

Ссылочные типы

Тип, определенный как class , является 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. Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.

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

Классы полностью поддерживают наследование, фундаментальный механизм объектно ориентированного программирования. При создании класса можно наследовать от любого другого класса, который не определен как sealed , а другие классы могут наследовать от класса и переопределять виртуальные методы класса. Кроме того, можно реализовать один или несколько интерфейсов.

При наследовании создается производный класс, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса, как показано далее:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

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

Класс в C# может напрямую наследовать только от одного базового класса. Тем не менее, поскольку базовый класс может сам наследовать от другого класса, класс может косвенно наследовать от нескольких базовых классов. Кроме того, класс может напрямую реализовать несколько интерфейсов. Дополнительные сведения см. в разделе Интерфейсы.

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

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

Пример

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

using System;

public class Person
{
    // Constructor that takes no arguments:
    public Person()
    {
        Name = "unknown";
    }

    // Constructor that takes one argument:
    public Person(string name)
    {
        Name = name;
    }

    // Auto-implemented readonly property:
    public string Name { get; }

    // Method that overrides the base class (System.Object) implementation.
    public override string ToString()
    {
        return Name;
    }
}
class TestPerson
{
    static void Main()
    {
        // Call the constructor that has no parameters.
        var person1 = new Person();
        Console.WriteLine(person1.Name);

        // Call the constructor that has one parameter.
        var person2 = new Person("Sarah Jones");
        Console.WriteLine(person2.Name);
        // Get the string representation of the person2 instance.
        Console.WriteLine(person2);
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

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

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