Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69

Узнать размер переменной

23.03.2025, 23:20. Показов 6193. Ответов 50

Студворк — интернет-сервис помощи студентам
Вопрос носит теоретический характер.

Вот можно узнать размер типа
C#
1
2
byte MyByte;
int Size = sizeof(byte);
Можно узнать тип переменной
C#
1
Type MyType = MyByte.GetType();
А вот узнать размер переменной по имени как-то не получается
C#
1
int Size = sizeof(MyByte); // не работает
В этом заложен какой-то глубокий смысл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2025, 23:20
Ответы с готовыми решениями:

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

Обеспечить возможность ввода значений в поля Размер x, Размер y
Создать меню с командами InputSize, Choose, Change, Exit. При выборе команды InputSize открывается диалоговое окно, содержащее два поля...

Подогнать размер картинки под размер формы
Здравствуйте! Я накладываю изображение на форму, но я столкнулся с проблемой. Мой код:this.BackgroundImage = new...

50
 Аватар для Andrey-MSK
3375 / 2261 / 388
Регистрация: 14.08.2018
Сообщений: 7,666
Записей в блоге: 4
02.04.2025, 08:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jack0v Посмотреть сообщение
Нет уж, я доем свой кактус!
Ну ваше дело конечно... Но если есть возможность использовать лучшее из набора ЯП (C/C++ - прямой доступ к памяти, железу и т.д., C# - простота построения UI и создания программы) в одном решении, то почему бы и не попробовать? MS не зря придумали C++/CLI... Он конечно сложный, так как там идёт смесь стандартного C++ и конструкций NET, и на первый взгляд это ваще кошмар, но в принципе если разобраться с ним, то можно делать оченно много интересного, особенно если работаешь с железом...
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
03.04.2025, 03:35  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Но это всё история прикладного уровня, учитывая что вы используете PcapDotNet, есть подозрение что городите виртуальный адаптер и таки не вы определяете формат пересылаемых данных.
Не совсем так, но можно сказать что и да. Тут ка в каком-нибудь IP-протоколе, значение каждого поля строго определяется его позицией. И ради какого-то protobuf протокол пересогласовывать никто не будет.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Он конечно сложный, так как там идёт смесь стандартного C++ и конструкций NET, и на первый взгляд это ваще кошмар, но в принципе если разобраться с ним, то можно делать оченно много интересного, особенно если работаешь с железом...
Может быть, если бы это было основным видом моей деятельности. Мне же надо просто забацать софтинку и вернуться к своим делам. Возможно и попробую как следующий случай подвернётся. А здесь я, вроде как, нащупал нужный способ.

Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
Плюс у вас изначальный вопрос был вообще про sizeof
Да про sizeof я ещё на первой странице всё понял. Но как водится, разговор как-то в другую степь съехал.
Цитата Сообщение от Wolfdp Посмотреть сообщение
придумали решение A
Это по началу, когда не знал про маршалинг.
Цитата Сообщение от Wolfdp Посмотреть сообщение
хотя возможно вам следует выбрать решение B
А потом как узнал! :D

0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
08.04.2025, 04:53
Цитата Сообщение от Jack0v Посмотреть сообщение
Мне же надо просто забацать софтинку и вернуться к своим делам.
Так давно бы забацал) А вот эти вот оптимизации это делается когда и если станет видно, что приложение работает не достаточно быстро.

Преждевременные оптимизации зло не меньшее, чем тормоза...
0
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
08.04.2025, 12:36
Reflection+рекурсия. А вообще - задача нетривиальная и геморная. Решить её можно, но следует 50 раз подумать, прежде чем в неё впутываться. Примерное решение:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
 
public static class MemoryCalculator
{
    /// <summary>
    /// Вычисляет приблизительный размер объекта в байтах.
    /// Для значимых типов используется Marshal.SizeOf,
    /// для ссылочных – рекурсивно обходятся все поля, свойства и эвенты.
    /// Чтобы избежать зацикливания, уже посещённые объекты не обрабатываются повторно.
    /// </summary>
    public static long CalculateSize<T>(T value)
    {
        // Используем хэш-сет для отслеживания уже посещённых объектов (по ссылке)
        var visited = new HashSet<object>(new ReferenceEqualityComparer());
        return CalculateSizeRecursive(value, visited);
    }
 
    private static long CalculateSizeRecursive(object value, HashSet<object> visited)
    {
        if (value == null)
            return 0;
 
        Type type = value.GetType();
 
        // Если тип является значимым, можно вызвать Marshal.SizeOf
        if (type.IsValueType)
        {
            try
            {
                return Marshal.SizeOf(type);
            }
            catch
            {
                // При ошибке – возвращаем 0 или можно добавить логирование
                return 0;
            }
        }
 
        // Для строк – специальный случай
        if (value is string str)
        {
            try
            {
                // Базовый размер строки + размер каждого символа (2 байта на char)
                return Marshal.SizeOf(typeof(string)) + (str.Length * sizeof(char));
            }
            catch
            {
                return 0;
            }
        }
 
        // Если объект уже посетили, чтобы избежать циклических ссылок, возвращаем 0
        if (visited.Contains(value))
            return 0;
        visited.Add(value);
 
        long size = 0;
 
        try
        {
            // Если объект реализует IEnumerable, можно перебрать элементы
            if (value is IEnumerable enumerable && !(value is IDictionary))
            {
                foreach (var item in enumerable)
                {
                    size += CalculateSizeRecursive(item, visited);
                }
            }
 
            // Обрабатываем поля – публичные, приватные, internal и т.д.
            FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            foreach (FieldInfo field in fields)
            {
                try
                {
                    object fieldValue = field.GetValue(value);
                    size += CalculateSizeRecursive(fieldValue, visited);
                }
                catch
                {
                    // Игнорируем ошибки доступа и продолжем обход
                }
            }
 
            // Обрабатываем свойства, если они доступны для чтения и не являются индексаторами
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            foreach (PropertyInfo property in properties)
            {
                // Пропускаем индексаторы
                if (property.GetIndexParameters().Length > 0)
                    continue;
                if (!property.CanRead)
                    continue;
                try
                {
                    object propValue = property.GetValue(value);
                    size += CalculateSizeRecursive(propValue, visited);
                }
                catch
                {
                    // Если возникает ошибка при получении значения свойства, продолжаем
                }
            }
 
            // Обрабатываем эвенты
            EventInfo[] events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            foreach (EventInfo evt in events)
            {
                try
                {
                    // Обычно за эвентом скрывается поле-делегат с таким же именем
                    FieldInfo eventField = type.GetField(evt.Name, BindingFlags.Instance | BindingFlags.NonPublic);
                    if (eventField != null)
                    {
                        object eventDelegate = eventField.GetValue(value);
                        size += CalculateSizeRecursive(eventDelegate, visited);
                    }
                }
                catch
                {
                    // Игнорируем ошибки, связанные с эвентами
                }
            }
 
        
        }
        catch
        {
            
        }
        return size;
    }
}
 
/// <summary>
/// Класс для сравнения объектов по ссылке, используется для предотвращения циклического обхода.
/// </summary>
public class ReferenceEqualityComparer : IEqualityComparer<object>
{
    public new bool Equals(object x, object y)
    {
        return ReferenceEquals(x, y);
    }
 
    public int GetHashCode(object obj)
    {
        if (obj == null)
            return 0;
        return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
    }
}
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
08.04.2025, 13:10
Цитата Сообщение от VBDUnit Посмотреть сообщение
А вообще - задача нетривиальная и геморная.
Вообще реальный размер объекта - это его shallow size. Если есть вложенные ссылки - то, это 4/8 байт на каждую (зависит от разрядности рантайма).
Тот же самый threshold размер для попадания в LOH (>= 85000 байт), исходит именно из shallow size, именно поэтому все что есть в LOH - это массивы.
Хотя для сериализации, тут да, нужно посчитать весь траффик по всем объектам.
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
12.04.2025, 03:47  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А вот эти вот оптимизации
Какие оптимизации? Вопрос был про sizeof(), потом сериализацию обсуждать начали. Причём тут оптимизации?

Цитата Сообщение от VBDUnit Посмотреть сообщение
А вообще - задача нетривиальная и геморная.
Знаю, с ссылочными типами заморочек много, поэтому стараюсь их не использовать, пока значимыми типами обхожусь.
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
12.04.2025, 10:50
Jack0v, оптимизации в данном случае - попытка вкорячить неродной подход к сериализации. Причины сделать это может быть только две: дурость или желание оптимизировать сериализацию до максимума.

Так ты говоришь, что оптимизация тут ни при чём?..
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
15.04.2025, 01:36  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
попытка вкорячить неродной подход к сериализации
Это какой?

Цитата Сообщение от Usaga Посмотреть сообщение
оптимизировать сериализацию
А это что значит? Её можно или сделать (разными способами) или вообще не делать. В каком смысле тут слово "оптимизация"?
0
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
17.04.2025, 18:41
Цитата Сообщение от Jack0v Посмотреть сообщение
А это что значит? Её можно или сделать (разными способами) или вообще не делать. В каком смысле тут слово "оптимизация"?
Например, если сериализация кастомная, и надо уменьшить расход памяти, количество аллокаций или нагрузку на CPU
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
18.04.2025, 03:51
Цитата Сообщение от Jack0v Посмотреть сообщение
Это какой?
Такой, который ты тут практикуешь)

Цитата Сообщение от Jack0v Посмотреть сообщение
А это что значит? Её можно или сделать (разными способами) или вообще не делать. В каком смысле тут слово "оптимизация"?
Ускорять, уменьшать размер сериализованных данных. Вроде бы это то, что ты хочешь сделать. Даже твоя реакция на protobuf об этом говорит.
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
19.04.2025, 00:56  [ТС]
Цитата Сообщение от VBDUnit Посмотреть сообщение
Например, если сериализация кастомная, и надо уменьшить расход памяти, количество аллокаций или нагрузку на CPU
Да на данном этапе эти вопросы даже и не стоят. И не факт что встанут.

Цитата Сообщение от Usaga Посмотреть сообщение
Такой, который ты тут практикуешь
Нормальный практикую.

Цитата Сообщение от Usaga Посмотреть сообщение
Вроде бы это то, что ты хочешь сделать. Даже твоя реакция на protobuf об этом говорит.
Совсем не это. И реакция моя на protobuf заключается не в том что он медленный и/или выдаёт громоздкий массив, а в том что он пихает туда свои поля которые не предусмотрены сетевым протоколом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2025, 00:56

Подогнать размер изображения под размер PictureBox
Как изменить размер изображения при открытии? А то когда я добавляю в пикчер бокс, они обычно бывают не того разрешения и либо вылазят...

Можно ли подогнать размер браузера под размер фонового изображения
Здравствуйте! Подскажите как сделать, чтоб фоновое изображение подходило по ширине к ширине окна браузера? Чтоб оно не дублировалось и не...

Размер приложения превышает размер ресурсов почти на 100 Мб
Здравствуйте..Столкнулся с такой проблемой: Сейчас пишу Metro-приложения под Windows 8..У меня есть некоторые файлы (ресурсы), которые...

Размер изображения в см. если дан размер в пикселях
Смотрю свойства изображения, а мне пишет 2652х4999 пикселей. Что это? Как их перевести в сантиметры? Добавлено через 10 минут ...

Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции
Подскажите, в чем ошибка? Выдает ошибку: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru