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分配的大小将只返回类型的大小.根据推论,这也只适用于可以编组的类型,其中列表不能.
你究竟想做什么?