Вы можете использовать оператор C # sizeof
, но он довольно ограничен, потому что вы должны указывать тип во время компиляции, и он может использоваться только для встроенных типов.Для класса Employee
вы можете сложить их вместе, чтобы определить размер класса.Однако все ссылочные типы в классе Employee
(например, String
) отдельно выделяются в куче, и вам придется добавить размер этих объектов, чтобы получить общий размер.
С некоторыми хитростями ILВы можете использовать следующий метод, чтобы вычислить, сколько байтов требует тип значения (struct
).Для типов ссылок он всегда будет возвращать размер ссылки (4 байта на 32 бита):
public int GetSizeOf(Type type) {
// Create a new method.
var method = new DynamicMethod(
"GetSizeOf",
typeof(UInt32),
new Type[0],
GetType(),
false
);
// Call sizeof(type) and return the result.
ILGenerator generator = method.GetILGenerator();
generator.Emit(OpCodes.Sizeof, type);
generator.Emit(OpCodes.Ret);
// Invoke the method.
var func = (Func<UInt32>) method.CreateDelegate(typeof(Func<UInt32>));
return checked((Int32) func());
}
Однако даже использование sizeof
для вычисления байтов не совсем точно.Объекты в куче будут иметь дополнительный дескриптор типа, который похож на указатель vtable в C ++.Как именно это делается, - это деталь реализации среды выполнения .NET.