В C #, сколько байтов использует System.Device.Location.GeoCoordinate? [Дубликат]

Является ли Microsoft Visual C ++ Compiler для Python 2.7 на http://www.microsoft.com/en-us/download/details.aspx?id=44266 не решением?

13
задан user 1 July 2012 в 11:00
поделиться

5 ответов

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

Вы не сделали.

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

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

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

7
ответ дан leppie 26 August 2018 в 23:22
поделиться

Следующее даст вам размер класса C #:

Marshal.SizeOf(typeof(Myclass));

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class Myclass
{

}

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

18
ответ дан animaonline 26 August 2018 в 23:22
поделиться

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

2
ответ дан anthonyv 26 August 2018 в 23:22
поделиться

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

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

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

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

0
ответ дан Esteban Araya 26 August 2018 в 23:22
поделиться

Большинство размещенных решений отличные и работают нормально, но у них есть ограничение на то, что ваш класс должен быть сериализуемым (подробнее см .: 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
ответ дан orellabac 26 August 2018 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: