Оператор
sizeof
применяется для получения размера указанного типа в байтах. При этом помните о двух исключительно важных факторах. Во-первых,
sizeof
можно применять только к размерным типам. Следовательно, хотя его можно использовать для членов классов, для классов как таковых его применять нельзя. Во-вторых,
sizeof
можно применять только в методах или блоках кода, помеченных как
unsafe. С
кодом такого рода мы познакомимся в главе 17. Вот пример использования оператора
sizeof
в методе класса, помеченного как
unsafe:
using System;
class BasicTypes {
// Примечание: Код, использующий оператор sizeof, // должен быть помечен как unsafe, static unsafe public void ShowSizesQ {
Console.WriteLine("\nPa3Mephi основных типов"); Console.WriteLine("Pa3Mep short = {0}", sizeof(short)); Console.WriteLine("Pa3Mep int = {0}", sizeof(int)); Console.Writel_ine("Pa3Mep long = {0}", sizeof(long)); Console.WriteLine("Pa3Mep bool = {0}", sizeof(bool)); } }
class UnsafeUpp
{
unsafe public static void MainQ
{
BasicTypes.ShowSizes();
} }
Вот результат выполнения этого приложения:
Размеры основных типов Размер short = 2 Размер int = 4 Размер long = 8 Размер bool = 1
Оператор
sizeof
можно использовать для определения размеров не только простых встроенных типов, но и пользовательских размерных типов, таких как структуры. Однако при этом результаты
sizeof
могут быть неочевидны:
// Использование оператора sizeof. using System;
struct StructWithNoMembers
{
}
struct StructWithMembers
{
short s;
int i;
long 1;
bool b; }
struct CompositeStruct
{
StructWithNoMembers a; StructWithMembers b;
StructWithNoMembers c; }
class UnSafe2App {
unsafe public static void Main() { Console.WriteLine("\nPa3Mep StructWithNoMembers structure = {0}",
sizeof(StructWithNoMembers)); Console.WriteLine("\nPa3Mep StructWithMembers structure = {0}",
sizeof(StructWithMembers)); Console.WriteLine("\nPa3Mep CompositeStruct structure = {0}",
sizeof(CompositeStruct)); } }
Хотя можно предположить, что это приложение выведет 0 для структуры без членов
(StructWithNoMembers),
15 для структуры с четырьмя членами базовых типов
(StructWithMembers)
и 15 для структуры, агрегирующей две предыдущие
(CompositeStruct),
в действительности результат будет таким:
Размер StructWithNoMembers structure = 1 Размер StructWithMembers structure = 16
Размер CompositeStruct structure = 24
Объяснение этому — способ сохранения конструкции
struct
компилятором в выходном файле, при котором компилятор применяет выравнивание и дополнение пробелами. Например, если структура имеет размер 3 байта и установлено выравнивание по 4-байтным границам, компилятор автоматически добавит в структуру 1 байт, и оператор
sizeof
укажет, что размер структуры — 4 байта. Не забывайте это учитывать при определении размера структур в С#.