Как получить размер байта типа в общем списке?
У меня есть этот общий список, и я хочу получить размер байта типа, например, если T является строкой или int и т.д., я пробовал оба способа, как написано в getByteSize(), и просто чтобы вы знали, что я использую только один способ за один раз...
но когда я пытаюсь скомпилировать, он выдает сообщение об ошибке "Ошибка: тип или имя пространства имен typeParameterType" не может быть найден (вам не хватает директивы using или ссылки на сборку?) "
public class iList<T> : List<T>
{
public int getByteSize ()
{
// way 1
Type typeParameterType = typeof(T);
return sizeof(typeParameterType);
// way 2
Type typeParameterType = this.GetType().GetGenericArguments()[0];
return sizeof(typeParameterType);
}
}
И что я здесь делаю неправильно?
Ответы
Ответ 1
sizeof
будет работать только над типами значений.
Для строки вы не будете знать фактический размер байта, пока не заполните его.
Если вы настроены на это, сериализуйте список и измерьте его. Хотя это не гарантированный способ, это, вероятно, лучше, чем альтернатива. Поцарапайте это. Это не даст вам то, что вы хотите, без каких-либо реальных усилий, если вообще. Вы можете выполнить быстрый и грязный счет, например:
public int getListSize()
{
Type type = typeof(T);
if (type.IsEnum)
{
return this.Sum(item => Marshal.SizeOf(Enum.GetUnderlyingType(type)));
}
if (type.IsValueType)
{
return this.Sum(item => Marshal.SizeOf(item));
}
if (type == typeof(string))
{
return this.Sum(item => Encoding.Default.GetByteCount(item.ToString()));
}
return 32 * this.Count;
}
Если вы действительно хотите узнать больше о размере, вот всеобъемлющий ответ по теме.
Ответ 2
sizeof
работает только для неуправляемых типов, таких как встроенные типы (int
, float
, char
и т.д...). Для ссылочных типов он просто возвращает размер указателя (обычно 4 для 32-битных систем) Он не будет работать вообще для ссылочных/управляемых типов (попробуйте его и посмотрите).
Также вы не передаете ему тип, вы передаете ему объект типа Type
.
Вместо этого вы можете попытаться использовать Marshal.SizeOf
, однако я не уверен, что это даст вам то, что вы хотите, для начала это только вернет размер типа после его сортировки, а не размер, выделенный CLR. По следствию это будет работать только с типами, которые могут быть сопоставлены, а списки не могут.
Что именно вы пытаетесь сделать?
Ответ 3
Вы можете использовать Marshal.SizeOf(typeof(T))
, но имейте в виду, что он может использовать для типов с неизвестным размером. Имейте в виду, что Marshal.SizeoOf(typeof(char)) == 1
.