Классы (Руководство по программированию на C#)Classes (C# Programming Guide)

Класс — это конструкция, которая позволяет создавать собственные настраиваемые типы путем группирования переменных других типов, методов и событий.A class is a construct that enables you to create your own custom types by grouping together variables of other types, methods and events. Класс похож на проект.A class is like a blueprint. Он определяет данные и поведение типа.It defines the data and behavior of a type. Если класс не объявлен статическим, то клиентский код может создавать его экземпляры.If the class is not declared as static, client code can create instances of it. Они представляют собой объекты, присваиваемые переменным.These instances are objects which are assigned to a variable. Экземпляр класса остается в памяти до тех пор, пока все ссылки на него не выйдут из области.The instance of a class remains in memory until all references to it go out of scope. В этот момент среда CLR помечает ее пригодной для сборки мусора.At that time, the CLR marks it as eligible for garbage collection. Если класс объявляется как статический, то его экземпляры создавать нельзя, и клиентский код может получать к нему доступ только через сам класс.If the class is declared as static, you cannot create instances, and client code can only access it through the class itself. Дополнительные сведения см. в статье Статические классы и члены статических классов.For more information, see Static Classes and Static Class Members.

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

Тип, который определен как класс, является ссылочным типом.A type that is defined as a class is a reference type. Когда во время выполнения вы объявляете переменную ссылочного типа, такая переменная будет содержать значение NULL, пока вы явным образом не создадите экземпляр класса с помощью оператора new или не назначите его объекту, созданному в другом месте, как показано в следующем примере:At run time, when you declare a variable of a reference type, the variable contains the value null until you explicitly create an instance of the class by using the new operator, or assign it an object that has been created elsewhere, as shown in the following example:

MyClass mc = new MyClass();
MyClass mc2 = mc;

При создании объекта выделяется память в управляемой куче, и переменная хранит только ссылку на расположение объекта.When the object is created, the memory is allocated on the managed heap, and the variable holds only a reference to the location of the object. Для типов в управляемой куче требуются временные затраты как при их выделении, так и удалении с помощью функции автоматического управления памятью в среде CLR, которая называется сборкой мусора.Types on the managed heap require overhead both when they are allocated and when they are reclaimed by the automatic memory management functionality of the CLR, which is known as garbage collection. Сборка мусора является высоко оптимизированным процессом и в большинстве случаев не приводит к возникновению проблем производительности.However, garbage collection is also highly optimized, and in most scenarios, it does not create a performance issue. Дополнительные сведения о сборке мусора см. в разделе Автоматическое управление памятью и сборка мусора.For more information about garbage collection, see Automatic memory management and garbage collection.

Объявление классовDeclaring Classes

Классы объявляются с помощью ключевого слова class, как показано в следующем примере:Classes are declared by using the class keyword, as shown in the following example:

public class Customer
{
   // Fields, properties, methods and events go here...
}

Ключевому слову class предшествует уровень доступа.The class keyword is preceded by the access level. Так как в этом случае используется открытый класс (public), любой пользователь может создавать его экземпляры.Because public is used in this case, anyone can create instances of this class. За именем класса следует ключевое слово class.The name of the class follows the class keyword. Оставшаяся часть определения — это тело класса, в котором задаются данные и поведение.The remainder of the definition is the class body, where the behavior and data are defined. Поля, свойства, методы и события в классе собирательно называются членами класса.Fields, properties, methods, and events on a class are collectively referred to as class members.

Создание объектовCreating Objects

Несмотря на то, что они иногда взаимозаменяемы, класс и объект — разные вещи.Although they are sometimes used interchangeably, a class and an object are different things. Класс определяет тип объекта, но не является объектом.A class defines a type of object, but it is not an object itself. Объект — это конкретная сущность, основанная на классе, которую иногда называют экземпляром класса.An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

Объекты можно создавать с помощью ключевого слова new, за которым следует имя класса, на котором будет основан объект, например следующим образом:Objects can be created by using the new keyword followed by the name of the class that the object will be based on, like this:

Customer object1 = new Customer();

При создании экземпляра класса ссылка на объект передается программисту.When an instance of a class is created, a reference to the object is passed back to the programmer. В предыдущем примере object1 представляет собой ссылку на объект, который основан на Customer.In the previous example, object1 is a reference to an object that is based on Customer. Эта ссылка указывает на новый объект, но не содержит данные этого объекта.This reference refers to the new object but does not contain the object data itself. Фактически, можно создать ссылку на объект без создания собственно объекта:In fact, you can create an object reference without creating an object at all:

Customer object2;

Создание таких ссылок, которые не указывают на объект, не рекомендуется, так как попытка доступа к объекту по такой ссылке приведет к сбою во время выполнения.We don't recommend creating object references such as this one that don't refer to an object because trying to access an object through such a reference will fail at run time. Однако такую ссылку можно сделать указывающей на объект, создав новый объект или назначив ее существующему объекту, как показано далее:However, such a reference can be made to refer to an object, either by creating a new object, or by assigning it to an existing object, such as this:

Customer object3 = new Customer();
Customer object4 = object3;

В этом коде создаются две ссылки на объект, которые указывают на один и тот же объект.This code creates two object references that both refer to the same object. Таким образом, любые изменения объекта, выполненные посредством object3, отражаются при последующем использовании object4.Therefore, any changes to the object made through object3 are reflected in subsequent uses of object4. Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.Because objects that are based on classes are referred to by reference, classes are known as reference types.

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

Классы полностью поддерживают наследование, фундаментальный механизм объектно ориентированного программирования.Classes fully support inheritance, a fundamental characteristic of object-oriented programming. Создаваемый класс может наследовать от любого другого интерфейса или класса, который не определен как запечатанный, а другие классы могут наследовать от этого класса и переопределять его виртуальные методы.When you create a class, you can inherit from any other interface or class that is not defined as sealed, and other classes can inherit from your class and override class virtual methods.

При наследовании создается производный класс, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение.Inheritance is accomplished by using a derivation, which means a class is declared by using a base class from which it inherits data and behavior. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса, как показано далее:A base class is specified by appending a colon and the name of the base class following the derived class name, like this:

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

Когда класс объявляет базовый класс, он наследует все члены базового класса, за исключением конструкторов.When a class declares a base class, it inherits all the members of the base class except the constructors. Дополнительные сведения см. в разделе Наследование.For more information, see Inheritance.

В отличие от C++, класс в C# может только напрямую наследовать от одного базового класса.Unlike C++, a class in C# can only directly inherit from one base class. Тем не менее, поскольку базовый класс может сам наследовать от другого класса, класс может косвенно наследовать от нескольких базовых классов.However, because a base class may itself inherit from another class, a class may indirectly inherit multiple base classes. Кроме того, класс может напрямую реализовать несколько интерфейсов.Furthermore, a class can directly implement more than one interface. Дополнительные сведения см. в разделе Интерфейсы.For more information, see Interfaces.

Класс может быть объявлен абстрактным.A class can be declared abstract. Абстрактный класс содержит абстрактные методы, которые имеют определение сигнатуры, но не имеют реализации.An abstract class contains abstract methods that have a signature definition but no implementation. Нельзя создавать экземпляры абстрактных классов.Abstract classes cannot be instantiated. Они могут использоваться только через производные классы, реализующие абстрактные методы.They can only be used through derived classes that implement the abstract methods. И наоборот, запечатанный класс не позволяет другим классам быть от него производными.By contrast, a sealed class does not allow other classes to derive from it. Дополнительные сведения см. в статье Абстрактные и запечатанные классы и члены классов.For more information, see Abstract and Sealed Classes and Class Members.

Определения классов можно разделить между различными исходными файлами.Class definitions can be split between different source files. Дополнительные сведения см. в разделе Разделяемые классы и методы.For more information, see Partial Classes and Methods.

ПримерExample

В следующем примере определяется открытый класс, содержащий автоматически реализуемое свойство, метод и специальный метод, который называется конструктором.The following example defines a public class that contains an auto-implemented property, a method, and a special method called a constructor. См. дополнительные сведения о свойствах, методах и конструкторах.For more information, see Properties, Methods, and Constructors topics. Затем создаются экземпляры этого класса с помощью ключевого слова new.The instances of the class are then instantiated with the new keyword.

    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.ToString();
        }
    }
    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);
            // OR use ToString method to get string representation of the person2 instance:
            Console.WriteLine(person2.ToString());

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
// Output:
// unknown
// Sarah Jones
// Sarah Jones

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

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee Also

Руководство по программированию на C#C# Programming Guide
Объектно-ориентированное программированиеObject-Oriented Programming
ПолиморфизмPolymorphism
ЧленыMembers
МетодыMethods
КонструкторыConstructors
Методы завершенияFinalizers
ОбъектыObjects