Как найти размер класса в C # - PullRequest
15 голосов
/ 25 февраля 2010
public class A
{
  int x;
  float y;
}

Как найти размер класса в C #. Есть ли такой оператор, как Sizeof (), который раньше был в C ++

Ответы [ 5 ]

22 голосов
/ 05 января 2012

Ниже приведен размер класса C #:

Marshal.SizeOf(typeof(Myclass));

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class Myclass
{

}

Помните, что размер класса зависит от заполнения.

8 голосов
/ 25 февраля 2010

Краткий ответ:

Вы не.

Длинный ответ:

Это можно сделать только в том случае, если вы печатаете, имеет фиксированный макет и не имеет управляемых членов. Структуры исправлены по умолчанию. Классы могут иметь фиксированную разметку.

(Я не показываю как, поскольку вам это действительно не нужно. Это важно только при взаимодействии.)

2 голосов
/ 25 февраля 2010

Вы можете сериализовать класс в поток памяти и затем получить размер оттуда, но я бы не советовал делать это, если бы вам не пришлось.

0 голосов
/ 16 января 2018

Большинство опубликованных решений великолепны и работают отлично, но у них есть ограничение на то, что ваш класс должен быть сериализуемым (подробнее см .: https://docs.microsoft.com/en-us/dotnet/standard/serialization/basic-serialization) Однако, если ваш класс не сериализуем, тогда может пригодиться следующий код. Этот код учитывает тот факт, что использование ссылочного поля не является свободным, это добавляет некоторые накладные расходы. Также рекомендуется использовать средний размер для строк, чтобы вы получили лучшее приближение.

    /// <summary>
    /// Gets the size of object.
    /// </summary>
    /// <param name="obj">The object.</param>
    /// <param name="avgStringSize">Average size of the string.</param>
    /// <returns>An approximation of the size of the object in bytes</returns>
    public static int GetSizeOfObject(object obj, int avgStringSize=-1)
    {
        int pointerSize = IntPtr.Size;
        int size = 0;
        Type type = obj.GetType();
        var info = type.GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
        foreach (var field in info)
        {
            if (field.FieldType.IsValueType)
            {
                size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType);
            }
            else
            {
                size += pointerSize;
                if (field.FieldType.IsArray)
                {
                    var array = field.GetValue(obj) as Array;
                    if (array != null)
                    {
                        var elementType = array.GetType().GetElementType();
                        if (elementType.IsValueType)
                        {
                            size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType) * array.Length;
                        }
                        else
                        {
                            size += pointerSize * array.Length;
                            if (elementType == typeof(string) && avgStringSize > 0)
                            {
                                size += avgStringSize * array.Length;
                            }
                        }
                    }
                }
                else if (field.FieldType == typeof(string) && avgStringSize > 0)
                {
                    size += avgStringSize;
                }
            }
        }
        return size;
    }
0 голосов
/ 25 февраля 2010

Если вы используете оператор sizeof, вы получите размер указателя (который, очевидно, будет одинаковым для всех объектов).

Вы можете написать свой собственный метод и выполнить итерацию (используя отражение) для всех элементов объекта (или тех, которые вас интересуют) и добавить размер каждого отдельного элемента.

Сложная часть сможет определить размер элемента, который не является нативным типом ... ваш метод должен быть несколько "рекурсивным".

Если бы вы реализовали вышеуказанную идею, у вас был бы приблизительный размер объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...