Типы и переменныеTypes and variables

В C# существуют две разновидности типов: ссылочные типы и типы значений.There are two kinds of types in C#: value types and reference types. Переменные типа значений содержат непосредственно данные, а в переменных ссылочных типов хранятся ссылки на нужные данные, которые именуются объектами.Variables of value types directly contain their data whereas variables of reference types store references to their data, the latter being known as objects. Две переменные ссылочного типа могут ссылаться на один и тот же объект, поэтому может случиться так, что операции над одной переменной затронут объект, на который ссылается другая переменная.With reference types, it is possible for two variables to reference the same object and thus possible for operations on one variable to affect the object referenced by the other variable. Каждая переменная типа значения имеет собственную копию данных, и операции над одной переменной не могут затрагивать другую (за исключением переменных параметров ref и out).With value types, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other (except in the case of ref and out parameter variables).

Типы значений в C# подразделяются на простые типы, типы перечисления, типы структур и типы, допускающие значение Null.C#’s value types are further divided into simple types, enum types, struct types, and nullable value types. Ссылочные типы в C# подразделяются на типы классов, типы интерфейсов, типы массивов и типы делегатов.C#’s reference types are further divided into class types, interface types, array types, and delegate types.

Далее представлены общие сведения о системе типов в C#.The following provides an overview of C#’s type system.

  • Типы значенийValue types
    • Простые типыSimple Types
      • Целочисленный со знаком: sbyte, short, int,longSigned integral: sbyte, short, int, long
      • Целочисленный без знака: byte, ushort, uint,ulongUnsigned integral: byte, ushort, uint, ulong
      • Символы Юникода: charUnicode characters: char
      • IEEE-представление с плавающей запятой: float, doubleIEEE floating point: float, double
      • Десятичный с повышенной точностью: decimalHigh-precision decimal: decimal
      • Логическое значение: boolBoolean: bool
    • Типы перечисленияEnum types
      • Пользовательские типы в формате enum E {...}User-defined types of the form enum E {...}
    • Типы структурStruct types
      • Пользовательские типы в формате struct S {...}User-defined types of the form struct S {...}
    • Типы значений, допускающие значение NULLNullable value types
      • Расширения других типов значений, допускающие значение nullExtensions of all other value types with a null value
  • Ссылочные типыReference types
    • Типы классовClass types
      • Исходный базовым классом для всех типов: objectUltimate base class of all other types: object
      • Строки Юникода: stringUnicode strings: string
      • Пользовательские типы в формате class C {...}User-defined types of the form class C {...}
    • Типы интерфейсаInterface types
      • Пользовательские типы в формате interface I {...}User-defined types of the form interface I {...}
    • Типы массивовArray types
      • Одно- и многомерные, например, int[] и int[,]Single- and multi-dimensional, for example, int[] and int[,]
    • Тип делегатовDelegate types
      • Пользовательские типы в формате delegate int D(...)User-defined types of the form delegate int D(...)

Восемь целочисленных типов обеспечивают поддержку 8-разрядных, 16-разрядных, 32-разрядных и 64-разрядных значений со знаком или без знака.The eight integral types provide support for 8-bit, 16-bit, 32-bit, and 64-bit values in signed or unsigned form.

Два типа чисел с плавающей запятой, float и double, представляются в следующих форматах IEC 60559: 32-разрядный одиночной точности и 64-разрядный двойной точности.The two floating-point types, float and double, are represented using the 32-bit single-precision and 64-bit double-precision IEC-60559 formats, respectively.

Тип decimal — это 128-разрядный тип данных для финансовых и денежных расчетов.The decimal type is a 128-bit data type suitable for financial and monetary calculations.

Тип bool в C# используется для представления логических значений, которые могут иметь значение true или false.C#’s bool type is used to represent Boolean values—values that are either true or false.

Обработка знаков и строк в C# выполняется в кодировке Юникода.Character and string processing in C# uses Unicode encoding. Тип char представляет элемент в кодировке UTF-16, а тип string представляет последовательность элементов в кодировке UTF-16.The char type represents a UTF-16 code unit, and the string type represents a sequence of UTF-16 code units.

Полный список числовых типов в C#.This summarizes C#’s numeric types.

  • Целочисленный со знакомSigned Integral
    • sbyte: 8 бит, в диапазоне от –128 до 127sbyte: 8 bits, range from -128 - 127
    • short: 16 бит, в диапазоне от –32 768 до 32 767short: 16 bits, range from -32,768 - 32,767
    • int: 32 бита, в диапазоне от –2 147 483 648 до 2 147 483 647int : 32 bits, range from -2,147,483,648 - 2,147,483,647
    • long: 64 бита, в диапазоне от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807long : 64 bits, range from –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • Целочисленный без знакаUnsigned integral
    • byte: 8 бит, в диапазоне от 0 до 255byte : 8 bits, range from 0 - 255
    • ushort: 16 бит, в диапазоне от 0 до 65 535ushort : 16 bits, range from 0 - 65,535
    • uint: 32 бита, в диапазоне от 0 до 4 294 967 295uint : 32 bits, range from 0 - 4,294,967,295
    • ulong: 64 бит, в диапазоне от 0 до 18 446 744 073 709 551 615ulong : 64 bits, range from 0 - 18,446,744,073,709,551,615
  • С плавающей запятойFloating point
    • float: 32 бита, в диапазоне от 1,5 × 10–45 до 3,4 × 1038, с точностью до 7 цифрfloat : 32 bits, range from 1.5 × 10−45 - 3.4 × 1038, 7-digit precision
    • double: 64 бита, в диапазоне от 5,0 × 10–324 до 1,7 × 10308, с точностью до 15 цифрdouble : 64 bits, range from 5.0 × 10−324 - 1.7 × 10308, 15-digit precision
  • Десятичное числоDecimal
    • decimal: 128 бит, в диапазоне по крайней мере от –7,9 × 10−28 до 7,9 × 1028, с точностью не менее 28 цифрdecimal : 128 bits, range is at least –7.9 × 10−28 - 7.9 × 1028, with at least 28-digit precision

Программы C# используют объявления типов для создания новых типов.C# programs use type declarations to create new types. В объявлении типа указываются имя и члены нового типа.A type declaration specifies the name and the members of the new type. Пять категорий типов в C# определяются пользователем: типы классов, типы структур, типы интерфейсов, типы перечисления и типы делегатов.Five of C#’s categories of types are user-definable: class types, struct types, interface types, enum types, and delegate types.

Тип class определяет структуру данных, которая содержит данные-члены (поля) и функции-члены (методы, свойства и т. д.).A class type defines a data structure that contains data members (fields) and function members (methods, properties, and others). Классы поддерживают механизмы одиночного наследования и полиморфизма, которые позволяют создавать производные классы, расширяющие и уточняющие определения базовых классов.Class types support single inheritance and polymorphism, mechanisms whereby derived classes can extend and specialize base classes.

Тип struct похож на тип класса тем, что он представляет структуру с данными-членами и функциями-членами.A struct type is similar to a class type in that it represents a structure with data members and function members. Но в отличие от классов, структуры являются типами значений и обычно не требуют выделения памяти из кучи.However, unlike classes, structs are value types and do not typically require heap allocation. Типы структуры не поддерживают определяемое пользователем наследование, и все типы структуры неявно наследуют от типа object.Struct types do not support user-specified inheritance, and all struct types implicitly inherit from type object.

Тип interface (интерфейс) определяет контракт в виде именованного набора открытых функций-членов.An interface type defines a contract as a named set of public function members. Объект типа class или struct, реализующий interface, должен предоставить реализации для всех функций-членов интерфейса.A class or struct that implements an interface must provide implementations of the interface’s function members. Тип interface может наследовать от нескольких базовых интерфейсов, а class или struct могут реализовывать несколько интерфейсов.An interface may inherit from multiple base interfaces, and a class or struct may implement multiple interfaces.

Тип delegate (делегат) представляющий ссылки на методы с конкретным списком параметров и типом возвращаемого значения.A delegate type represents references to methods with a particular parameter list and return type. Делегаты позволяют использовать методы как сущности, сохраняя их в переменные и передавая в качестве параметров.Delegates make it possible to treat methods as entities that can be assigned to variables and passed as parameters. Делегаты аналогичны типам функций, которые используются в функциональных языках.Delegates are analogous to function types provided by functional languages. Также принцип их работы близок к указателям функций из некоторых языков, но в отличие от указателей функций делегаты являются объектно-ориентированными и строго типизированными.They are also similar to the concept of function pointers found in some other languages, but unlike function pointers, delegates are object-oriented and type-safe.

Типы class, struct, interface и delegate поддерживают универсальные шаблоны, которые позволяют передавать им другие типы в качестве параметров.The class, struct, interface and delegate types all support generics, whereby they can be parameterized with other types.

Тип enum является отдельным типом со списком именованных констант.An enum type is a distinct type with named constants. Каждый тип enum имеет базовый тип, в роли которого выступает одним из восьми целочисленных типов.Every enum type has an underlying type, which must be one of the eight integral types. Набор значений типа enum аналогичен набору значений его базового типа.The set of values of an enum type is the same as the set of values of the underlying type.

C# поддерживает одно- и многомерные массивы любого типа.C# supports single- and multi-dimensional arrays of any type. В отличие от перечисленных выше типов, типы массивов не требуется объявлять перед использованием.Unlike the types listed above, array types do not have to be declared before they can be used. Типы массивов можно сформировать, просто введя квадратные скобки после имени типа.Instead, array types are constructed by following a type name with square brackets. Например, int[] является одномерным массивом значений типа int, а int[,] — двумерным массивом значений типа int, тогда как int[][] представляет собой одномерный массив одномерных массивов значений типа int.For example, int[] is a single-dimensional array of int, int[,] is a two-dimensional array of int, and int[][] is a single-dimensional array of single-dimensional array of int.

Типы значений, допускающие значение Null, также не нужно отдельно объявлять перед использованием.Nullable value types also do not have to be declared before they can be used. Для каждого обычного типа значений T, который не допускает значение Null, существует идентичный тип T?, который отличается только тем, что может содержать значение null.For each non-nullable value type T there is a corresponding nullable value type T?, which can hold an additional value, null. Например int? — это тип, который может содержать любое 32-разрядное целое число или значение null.For instance, int? is a type that can hold any 32-bit integer or the value null.

Система типов в C# унифицирована таким образом, что значение любого типа можно рассматривать как object (объект).C#’s type system is unified such that a value of any type can be treated as an object. Каждый тип в C# является прямо или косвенно производным от типа класса object, и этот тип object является исходным базовым классом для всех типов.Every type in C# directly or indirectly derives from the object class type, and object is the ultimate base class of all types. Чтобы значения ссылочного типа обрабатывались как объекты, им просто присваивается тип object.Values of reference types are treated as objects simply by viewing the values as type object. Чтобы значения типов значений обрабатывались как объекты, выполняются операции упаковки-преобразования и распаковки-преобразования.Values of value types are treated as objects by performing boxing and unboxing operations. В следующем примере значение int преобразуется в object, а затем обратно в int.In the following example, an int value is converted to object and back again to int.

using System;
class BoxingExample
{
    static void Main()
    {
        int i = 123;
        object o = i;    // Boxing
        int j = (int)o;  // Unboxing
    }
}

Если значение для типа значения преобразуется в тип object, то для хранения этого значения выделяется экземпляр object, который также называется "упаковкой", и значение копируется в эту упаковку.When a value of a value type is converted to type object, an object instance, also called a "box", is allocated to hold the value, and the value is copied into that box. И наоборот, если ссылка типа object используется для типа значения, для соответствующего object выполняется проверка, является ли он упаковкой правильного типа. Если эта проверка завершается успешно, копируется значение этой упаковки.Conversely, when an object reference is cast to a value type, a check is made that the referenced object is a box of the correct value type, and, if the check succeeds, the value in the box is copied out.

Унифицированная система типов C# фактически позволяет преобразовывать типы значений в объекты "по требованию".C#’s unified type system effectively means that value types can become objects "on demand." Такая унификация позволяет применять универсальные библиотеки, использующие тип object, как со ссылочными типами, так и с типами значений.Because of the unification, general-purpose libraries that use type object can be used with both reference types and value types.

В C# существует несколько типов переменных, в том числе поля, элементы массива, локальные переменные и параметры.There are several kinds of variables in C#, including fields, array elements, local variables, and parameters. Переменные представляют места хранения, и каждая переменная имеет тип, который определяет допустимые значения для хранения в этой переменной. Примеры представлены ниже.Variables represent storage locations, and every variable has a type that determines what values can be stored in the variable, as shown below.

  • Тип значения, не допускающий значения NullNon-nullable value type
    • Значение такого типаA value of that exact type
  • Тип значения, допускающий значение NullNullable value type
    • Значение null или значение такого типаA null value or a value of that exact type
  • objectobject
    • Ссылка null, ссылка на объект любого ссылочного типа или ссылка на упакованное значение любого типа значенияA null reference, a reference to an object of any reference type, or a reference to a boxed value of any value type
  • Тип классаClass type
    • Ссылка null, ссылка на экземпляр такого типа класса или ссылка на экземпляр любого класса, производного от такого типа классаA null reference, a reference to an instance of that class type, or a reference to an instance of a class derived from that class type
  • Тип интерфейсаInterface type
    • Ссылка null, ссылка на экземпляр типа класса, который реализует такой тип интерфейса, или ссылка на упакованное значение типа значения, которое реализует такой тип интерфейсаA null reference, a reference to an instance of a class type that implements that interface type, or a reference to a boxed value of a value type that implements that interface type
  • Тип массиваArray type
    • Ссылка null, ссылка на экземпляр такого типа массива или ссылка на экземпляр любого совместимого типа массиваA null reference, a reference to an instance of that array type, or a reference to an instance of a compatible array type
  • Тип делегатаDelegate type
    • Ссылка null или ссылка на экземпляр совместимого типа делегатаA null reference or a reference to an instance of a compatible delegate type

Назад ВпередPrevious Next