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

Классы и структуры являются двумя основными конструкциями системы общих типов CTS, используемой в платформе .NET Framework.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. Оба они являются структурами данных, которые инкапсулируют набор данных и поведений в одной логической сущности.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. Данные и поведение являются членами класса или структуры. К ним относятся методы, свойства, события и другие элементы, которые описаны далее в этой статье.The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

Объявление класса или структуры служит своего рода чертежом для создания экземпляров или объектов во время выполнения.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Если вы определите класс или структур с именем Person, то Person здесь обозначает имя типа.If you define a class or struct called Person, Person is the name of the type. Если вы объявите и инициализируете переменную p типа Person, принято говорить, что p является объектом (или экземпляром) Person.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. Можно создать несколько экземпляров одного типа Person, и каждый экземпляр будет иметь разные значения свойств и полей.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

Класс является ссылочным типом.A class is a reference type. Когда вы создаете объект класса и сохраняете его в переменную, эта переменная содержит только ссылку на память объекта.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. Если ссылка на объект сохраняется в новую переменную, эта переменная также ссылается на исходный объект.When the object reference is assigned to a new variable, the new variable refers to the original object. Изменения, внесенные через одну переменную, отражаются и в другой переменной, поскольку обе они ссылаются на одни и те же данные.Changes made through one variable are reflected in the other variable because they both refer to the same data.

Структура (struct) является типом значения.A struct is a value type. При создании структуры переменная, которой присвоена структура, содержит фактические данные этой структуры.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. Если структура присваивается новой переменной, все данные копируются.When the struct is assigned to a new variable, it is copied. Таким образом, новая переменная и исходная переменная содержат две отдельные копии одинаковых данных.The new variable and the original variable therefore contain two separate copies of the same data. Изменения, внесенные в одну копию, не влияют на другую.Changes made to one copy do not affect the other copy.

В общем случае классы используются для моделирования более сложного поведения или для таких данных, которые будут изменяться после создания объекта класса.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Структуры лучше подходят для небольших структур данных, информация в которых не должна изменяться после создания структуры.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

Подробную информацию можно получить в описаниях классов, объектов и структур.For more information, see Classes, Objects, and Structs.

ПримерExample

В следующем примере в пространстве имен ProgrammingGuide определен класс CustomClass с тремя членами: конструктор экземпляра, свойство с именем Number и метод с именем Multiply.In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. Метод Main в классе Program создает экземпляр (объект) класса CustomClass. Обращение к методам и свойствам объекта осуществляется с использованием точечной нотации.The Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

namespace ProgrammingGuide
{
   // Class definition.
   public class CustomClass
   {
      // Class members.
      //
      // Property.
      public int Number { get; set; }

      // Method.
      public int Multiply(int num)
      {
          return num * Number;
      }

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

         // Set the value of the public property.
         custClass.Number = 27;

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

ИнкапсуляцияEncapsulation

Концепцию инкапсуляции признают одним из основополагающих принципов объектно-ориентированного программирования.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. Принцип инкапсуляции заключается в том, что в классе или структуре можно указать уровень доступности для обращения к каждому из его членов из кода, расположенного вне этого класса или структуры.According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. Вы можете скрыть методы и переменные, которые не предназначены для использования вне класса или сборки. Это позволяет снизить риск ошибок в коде и вредоносных действий.Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

Дополнительные сведения о классах вы найдете в статьях Классы и Объекты.For more information about classes, see Classes and Objects.

УчастникиMembers

Все методы, поля, константы, свойства и события должны объявляться внутри типа. Совокупно они называются членами типа.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. В C# не существует глобальных переменных или методов, как в некоторых других языках.In C#, there are no global variables or methods as there are in some other languages. Даже точка входа программы, то есть метод Main, должна объявляться внутри класса или структуры.Even a program's entry point, the Main method, must be declared within a class or struct. Ниже приведен полный список возможных членов, которые можно объявить в классе или структуре.The following list includes all the various kinds of members that may be declared in a class or struct.

Специальные возможностиAccessibility

Некоторые методы и свойства специально предназначены для того, чтобы их вызов или доступ к ним осуществлялся из клиентского кода, то есть из кода за пределами этого класса или структуры.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. Другие методы и свойства могут использоваться только в самом классе или структуре.Other methods and properties might be only for use in the class or struct itself. Важно ограничить доступность кода так, чтобы только нужные элементы клиентского кода получали к нему доступ.It is important to limit the accessibility of your code so that only the intended client code can reach it. Уровень доступности для типов и их членов вы можете задать с помощью модификаторов доступа public, protected, internal, protected internal, private и private protected.You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. По умолчанию используется режим доступа private.The default accessibility is private. Дополнительные сведения см. в статье Модификаторы доступа.For more information, see Access Modifiers.

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

Классы (но не структуры) поддерживают наследование.Classes (but not structs) support the concept of inheritance. Класс, производный от другого класса (базового класса), автоматически включает все открытые, защищенные и внутренние члены базового класса за исключением конструкторов и методов завершения.A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. Дополнительные сведения см. в статьях о наследовании и полиморфизме.For more information, see Inheritance and Polymorphism.

Классы могут быть объявлены как абстрактные. Это означает, что один или несколько их членов не имеют реализации.Classes may be declared as abstract, which means that one or more of their methods have no implementation. Из абстрактных классов нельзя напрямую создать экземпляры. Они выполняют роль базовых классов для других классов, которые предоставляют реализацию недостающих членов.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. Также классы можно объявить запечатанными, чтобы запретить наследование от них других классов.Classes can also be declared as sealed to prevent other classes from inheriting from them. Дополнительные сведения см. в статье Абстрактные и запечатанные классы и члены классов.For more information, see Abstract and Sealed Classes and Class Members.

интерфейсов,Interfaces

Классы и структуры могут наследовать несколько интерфейсов.Classes and structs can inherit multiple interfaces. Наследование интерфейса означает, что тип реализует все методы, определенные в этом интерфейсе.To inherit from an interface means that the type implements all the methods defined in the interface. Дополнительные сведения см. в статье Интерфейсы.For more information, see Interfaces.

Универсальные типыGeneric Types

Для класса или структуры можно определить один или несколько параметров типа.Classes and structs can be defined with one or more type parameters. Клиентский код назначает тип при создании экземпляра типа.Client code supplies the type when it creates an instance of the type. Например, класс List<T> в пространстве имен System.Collections.Generic определен с помощью одного параметра типа.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. Клиентский код создает экземпляр List<string> или List<int>, информируя о том, сущности какого типа будут храниться в этом списке.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. Дополнительные сведения см. в статье Универсальные шаблоны.For more information, see Generics.

Статические типыStatic Types

Классы (но не структуры) могут быть объявлены как статические.Classes (but not structs) can be declared as static. Статический класс может содержать только статические члены. Для него нельзя создать экземпляр с помощью ключевого слова new.A static class can contain only static members and cannot be instantiated with the new keyword. При запуске программы в память загружается одна копия такого класса. Доступ к его членам осуществляется через имя класса.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. Классы и структуры могут содержать статические члены.Both classes and structs can contain static members. Дополнительные сведения см. в статье Статические классы и члены статических классов.For more information, see Static Classes and Static Class Members.

Вложенные типыNested Types

Класс или структура могут быть вложены в другой класс или структуру.A class or struct can be nested within another class or struct. Дополнительные сведения см. в разделе Вложенные типы.For more information, see Nested Types.

Разделяемые типыPartial Types

Вы можете разделить определение класса, структуры или метода на несколько файлов с кодом.You can define part of a class, struct or method in one code file and another part in a separate code file. Дополнительные сведения см. в статье Разделяемые классы и методы.For more information, see Partial Classes and Methods.

Инициализаторы объектовObject Initializers

Вы можете создавать и инициализировать экземпляры класса или структуры, а также коллекции объектов, без явного вызова соответствующих конструкторов.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. Дополнительные сведения см. в статье Инициализаторы объектов и коллекций.For more information, see Object and Collection Initializers.

Анонимные типыAnonymous Types

В некоторых ситуациях нет смысла или пользы создавать именованный класс, например при заполнении списка структурами данных, которые не будут сохраняться или передаваться другому методу. В таких случаях можно использовать анонимные типы.In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. Дополнительные сведения см. в статье Анонимные типы.For more information, see Anonymous Types.

Методы расширенияExtension Methods

Вы можете "расширить" класс, даже не создавая производного класса. Для этого можно создать отдельный тип и вызывать его методы так, как если бы они принадлежали исходному типу.You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. Дополнительные сведения см. в статье Методы расширения.For more information, see Extension Methods.

Неявно типизированные локальные переменныеImplicitly Typed Local Variables

Внутри метода класса или структуры можно использовать неявное типизирование, чтобы компилятор самостоятельно определял правильный тип во время компиляции.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. Дополнительные сведения см. в статье Implicitly Typed Local Variables (Неявно типизированные локальные переменные).For more information, see Implicitly Typed Local Variables.

Спецификация языка 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