.NET :如何计算引用类型所占用的空间

引用类型是在堆上面分配的,与值类型不同的是,.NET没有办法直接计算得到它们所占用的大小。下面是一个解决方法。
 
using System;
using System.Reflection;


namespace Sample
{

    public class Customer {
        public int Id { get; set; }
        public string CompanyName { get; set; }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(SizeOf
  
  
   
   ());
            Console.Read();
        }

        
   
   public 
   
   static 
   
   int SizeOf
   
   
    
    ()
        {
            
    
    return SizeOf(
    
    typeof(T));
        }

        
    
    public 
    
    unsafe 
    
    static 
    
    int SizeOf(Type targetType)
        {
            
    
    if (targetType == 
    
    null) 
    
    return 0;
            var result = 0;
            
    
    foreach (var fld 
    
    in targetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                
    
    switch (Type.GetTypeCode(fld.FieldType))
                {
                    
    
    case TypeCode.Boolean: result += 
    
    sizeof(
    
    bool); 
    
    break;
                    
    
    case TypeCode.Byte: result += 
    
    sizeof(
    
    byte); 
    
    break;
                    
    
    case TypeCode.Char: result += 
    
    sizeof(
    
    char); 
    
    break;
                    
    
    case TypeCode.DateTime: result += 
    
    sizeof(DateTime); 
    
    break;
                    
    
    case TypeCode.String:
                    
    
    case TypeCode.DBNull: result += IntPtr.Size; 
    
    break;
                    
    
    case TypeCode.Decimal: result += 
    
    sizeof(
    
    decimal); 
    
    break;
                    
    
    case TypeCode.Double: result += 
    
    sizeof(
    
    double); 
    
    break;
                    
    
    case TypeCode.Int16: result += 
    
    sizeof(Int16); 
    
    break;
                    
    
    case TypeCode.Int32: result += 
    
    sizeof(Int32); 
    
    break;
                    
    
    case TypeCode.Int64: result += 
    
    sizeof(Int64); 
    
    break;
                    
    
    case TypeCode.SByte: result += 
    
    sizeof(SByte); 
    
    break;
                    
    
    case TypeCode.Single: result += 
    
    sizeof(
    
    float); 
    
    break;
                    
    
    case TypeCode.UInt16: result += 
    
    sizeof(UInt16); 
    
    break;
                    
    
    case TypeCode.UInt32: result += 
    
    sizeof(UInt32); 
    
    break;
                    
    
    case TypeCode.UInt64: result += 
    
    sizeof(UInt64); 
    
    break;
                    
    
    case TypeCode.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;
                }
            
    
    return result + SizeOf(targetType.BaseType);
        } 
    }


}

   
   
  
  
注意:选中下图中的“允许不安全代码”
image 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值