// Создать буфер фиксированного размера, unsafe struct FixedBankRecord { public fixed byte Name[80]; public double Balance; public long ID;
}
class FixedSizeBuffer {
// Пометить метод Main как небезопасный, unsafe static void Main {
Console.WriteLine("Размер структуры FixedBankRecord: " + sizeof(FixedBankRecord));
}
}
Эта программа дает следующий результат.
Размер структуры FixedBankRecord: 96
Размер структурыFixedBankRecordоказывается в точности равным сумме ее членов, но так бывает далеко не всегда со структурами, содержащими буферы фиксированного размера. Ради повышения эффективности кода общая длина структуры может быть увеличена для выравнивания по четной границе, например по границе слова. Поэтому общая длина структуры может оказаться на несколько байтов больше, чем сумма ее членов, даже если в ней содержатся буферы фиксированного размера. Как правило, аналогичное выравнивание длины структуры происходит и в C++. Следует, однако, иметь в виду возможные отличия в этом отношении.
И наконец, обратите внимание на то, как в данной программе создается буфер фиксированного размера вместо массиваName.
public fixed byte Name[80]; // создать буфер фиксированного размера
Как видите, размер массива указывается после его имени. Такое обозначение обычно принято в C++ и отличается в объявлениях массивов в С#. В данном операторе распределяется по 80 байтов памяти в пределах каждого объекта типаFixedBankRecord.
Обнуляемые типы
Начиная с версии 2.0, в C# внедрено средство, обеспечивающее изящное решение типичной и не очень приятной задачи распознавания и обработки полей, не содержащих значения, т.е. неинициализированных полей. Это средство называется