如何在通用列表中获取字节大小的类型?

时间:2011-08-31 10:56:54

标签: c# list byte sizeof generic-list

我有这个通用列表,我想得到类型的字节大小,如果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);
        }
    }

想到我在这里做错了什么?

3 个答案:

答案 0 :(得分:10)

sizeof仅适用于非托管类型,例如内置类型(intfloatchar等...)。 对于引用类型,它只返回指针的大小(对于32位系统通常为4)它对于引用/托管类型根本不起作用(试试看)。

你也没有传递一个类型,你传递的是Type类型的对象。

你可能想尝试使用Marshal.SizeOf,但是我不确定这会给你你想要的东西,首先它只会在编组之后返回类型的大小,而不是CLR分配的大小。根据推论,这也只适用于可以编组的类型,其中列表不能编组。

你究竟想做什么?

答案 1 :(得分:10)

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;
}

如果您真的想了解有关尺寸的更多信息,请参阅主题comprehensive answer

答案 2 :(得分:6)

您可以使用Marshal.SizeOf(typeof(T))但请注意,它可以投放大小未知的类型。请注意Marshal.SizeoOf(typeof(char)) == 1