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

Saf*_*Ali 12 c# byte list 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*lls 11

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;
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想知道更多关于大小,这里是一个全面的答案的话题.


Jus*_*tin 10

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

你也没有传递它的类型,你传递的是类型的对象Type.

你可能想使用尝试Marshal.SizeOf,而不是,但我不知道这会给你想要的东西,入手这款已经整理后,不是由CLR分配的大小将只返回类型的大小.根据推论,这也只适用于可以编组的类型,其中列表不能.

你究竟想做什么?

  • @S C#中的内存使用总是难以估计.只有内置类型和一些结构(枚举类型,指针类型和用户定义的结构,不包含任何作为引用类型的字段或属性)可以是`sizeof`fed.其他物体是"不透明的". (2认同)

xan*_*tos 6

你可以使用,Marshal.SizeOf(typeof(T))但要注意它可以抛出未知大小的类型.请注意Marshal.SizeoOf(typeof(char)) == 1.