.NET :如何计算引用类型所占用的空间
2009-12-09 20:25
435 查看
引用类型是在堆上面分配的,与值类型不同的是,.NET没有办法直接计算得到它们所占用的大小。下面是一个解决方法。
usingSystem;
usingSystem.Reflection;
namespaceSample
{
publicclassCustomer{
publicintId{get;set;}
publicstringCompanyName{get;set;}
}
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine(SizeOf<Customer>());
Console.Read();
}
publicstaticintSizeOf<T>()
{
returnSizeOf(typeof(T));
}
publicunsafestaticintSizeOf(TypetargetType)
{
if(targetType==null)return0;
varresult=0;
foreach(varfldintargetType.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
switch(Type.GetTypeCode(fld.FieldType))
{
caseTypeCode.Boolean:result+=sizeof(bool);break;
caseTypeCode.Byte:result+=sizeof(byte);break;
caseTypeCode.Char:result+=sizeof(char);break;
caseTypeCode.DateTime:result+=sizeof(DateTime);break;
caseTypeCode.String:
caseTypeCode.DBNull:result+=IntPtr.Size;break;
caseTypeCode.Decimal:result+=sizeof(decimal);break;
caseTypeCode.Double:result+=sizeof(double);break;
caseTypeCode.Int16:result+=sizeof(Int16);break;
caseTypeCode.Int32:result+=sizeof(Int32);break;
caseTypeCode.Int64:result+=sizeof(Int64);break;
caseTypeCode.SByte:result+=sizeof(SByte);break;
caseTypeCode.Single:result+=sizeof(float);break;
caseTypeCode.UInt16:result+=sizeof(UInt16);break;
caseTypeCode.UInt32:result+=sizeof(UInt32);break;
caseTypeCode.UInt64:result+=sizeof(UInt64);break;
caseTypeCode.Object:
if(fld.FieldType.Equals(typeof(UIntPtr)))
{
result+=UIntPtr.Size;
break;
}
if(fld.FieldType.Equals(typeof(IntPtr)))
{
result+=IntPtr.Size;
break;
}
if(fld.FieldType.IsValueType)
{
result+=SizeOf(fld.FieldType);
break;
}
if(fld.FieldType.IsEnum)
{
result+=SizeOf(Enum.GetUnderlyingType(fld.FieldType));
break;
}
result+=IntPtr.Size;break;
default:continue;
}
returnresult+SizeOf(targetType.BaseType);
}
}
}
注意:选中下图中的“允许不安全代码”
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- .NET :如何计算引用类型所占用的空间
- 值类型变量所占用的内存空间位于线程堆栈中,而引用类型变量所引用的对象生存于托管堆中。
- C++的引用类型的变量到底占不占用内存空间?
- 如何计算Java对象占用了多少空间?
- .net如何引用System.Drawing.Drawing2D 命名空间和System.Drawing.Image及其相关概念
- 提问:错误提示--命名空间“System.Web”中不存在类型或命名空间名称“UI”(是缺少程序集引用吗?) 如何解决??
- 【草稿】.net 中已经引用了dll,但是编译报错找不到类型或者命名空间
- C++的引用类型的变量到底占不占用内存空间?
- 如何计算Java对象占用了多少空间?
- 提问:错误提示--命名空间“System.Web”中不存在类型或命名空间名称“UI”(是缺少程序集引用吗?) 如何解决??
- SQL如何修改被计算字段引用的字段类型
- 如何计算Java对象占用了多少空间?
- java的引用类型所占用的内存空间
- “”命名空间“System.Web”中不存在类型或命名空间名称“HttpUtility”。是否缺少程序集引用“解决方法
- 计算数据库中各个表的数据量和每行记录所占用空间
- .net值类型与引用类型的区别
- .NET中六个你必须知道的重要概念之值类型和引用类型
- android Imageview bitmap 占用内存空间的计算
- 类占用空间的计算
- [C#错误]未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)