您的位置:首页 > 其它

.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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐