В зависимости от потребностей questionee, Маршала. SizeOf мог бы или не мог бы дать Вам, что Вы хотите. (Отредактированный после того, как Jon Skeet отправил свой ответ).
using System;
using System.Runtime.InteropServices;
public class MyClass
{
public static void Main()
{
Int32 a = 10;
Console.WriteLine(Marshal.SizeOf(a));
Console.ReadLine();
}
}
Примечание, что, поскольку jkersch говорит, sizeof, может использоваться, но к сожалению только с типами значения. Если Вам нужен размер класса, Маршала. SizeOf является способом пойти.
Jon Skeet разметил почему ни sizeof, ни Маршал. SizeOf прекрасен. Я предполагаю, что questionee должен решить, приемлем ли любой для его проблемы.
Вы не можете в основном. Это будет зависеть от дополнения, которое может быть основано на версии CLR, которую Вы используете и процессор и т.д. Легче разработать общий размер объекта, предполагая, что это не имеет никаких ссылок на другие объекты: создайте большой массив, используйте GC.GetTotalMemory для базисной точки, заполните массив ссылками на новые экземпляры Вашего типа, и затем назовите GetTotalMemory снова. Примите одно значение далеко от другого и разделитесь на количество экземпляров. Необходимо, вероятно, создать единственный экземпляр заранее, чтобы удостовериться, что никакой новый код JITted не способствует числу. Да, это как hacky, поскольку это звучит - но я использовал его успешно до настоящего времени.
Только вчера я думал, что это будет хорошая идея записать немного класса помощника для этого. Сообщите мне, было ли Вам интересно.
РЕДАКТИРОВАНИЕ: существует два других предложения, и я хотел бы обратиться к ним обоим.
Во-первых, оператор sizeof : это только показывает, сколько пространства тип поднимает в кратком обзоре без дополнения прикладного раунда это. (Это включает дополнение в структуре, но не дополнение относилось к переменной того типа в другом типе.)
Затем, Маршал. SizeOf: это только показывает неуправляемый размер после маршалинга, не фактического размера в памяти. Поскольку документация явно указывает:
возвращенный размер на самом деле размер неуправляемого типа. Неуправляемые и управляемые размеры объекта могут отличаться. Для типов символов размер затронут значением CharSet, относился к тому классу.
И снова, дополнение может иметь значение.
Просто для уточнения, что я имею в виду о дополнении быть релевантным, рассмотрите эти два класса:
class FourBytes { byte a, b, c, d; }
class FiveBytes { byte a, b, c, d, e; }
На моем x86 поле, экземпляр FourBytes берет 12 байтов (включая издержки). Экземпляр FiveBytes берет 16 байтов. Единственная разница "e" является переменным - таким образом, это берет 4 байта? Ну, вид... и вид нет. Справедливо, очевидно, Вы могли удалить любую единственную переменную из FiveBytes для возвращения размера вниз к 12 байтам, но это не означает, что каждый из переменных поднимает 4 байта (думайте об удалении всех их!). Стоимость единственной переменной просто не является понятием, которое имеет много смысла здесь.
если у Вас есть тип, используйте sizeof оператор. это возвратит размер типа в байте. например,
Консоль. WriteLine (sizeof (интервал));
произведет:
4
Использование System.Runtime.CompilerServices.Unsafe.SizeOf<T>() where T: unmanaged
Документация состояния:
Возвраты размер объекта данного параметра типа.
Это, кажется, использует sizeof
IL-инструкция так же, как , решение Earlz делает также. ( источник )
unmanaged
ограничение является новым в C# 7.3