C# リフレクション Type型をRuntimeTypeHandleに変換しメモリ使用量を節約する

Type型オブジェクトをメモリに載せておくよりは、TypeオブジェクトをRuntimeTypeHandleに変換してメモリに保持しておくほうが、メモリ使用量を節約できる。

using System;
using System.Reflection;
using System.Collections.Generic;

public sealed class Program
{
    public static void Main()
    {
        Console.WriteLine("メモリ使用量の初期値: {0}[B]",
            GC.GetTotalMemory(true));

        //たくさんのTypeオブジェクトをListに格納する
        Module m = typeof(String).Module;
        List<Type> types = new List<Type>();
        for (Int32 i = 0; i < 100; i++)
        {
            types.AddRange(m.GetTypes());
        }

        Console.WriteLine("TypeオブジェクトをListに {0}個 格納後のメモリ使用量: {1}[B]", 
            types.Count, GC.GetTotalMemory(true));

        //TypeオブジェクトをRuntimeTypeHandleに変換する
        List<RuntimeTypeHandle> typeHandles = 
            types.ConvertAll<RuntimeTypeHandle>(
            delegate(Type t) 
            { 
                return Type.GetTypeHandle(t); 
            });

        GC.KeepAlive(types);
        types = null;//typesはGC可能

        Console.WriteLine("RuntimeTypeHandleに変換後のメモリ使用量: {0}[B]",
            GC.GetTotalMemory(true));
        
    }
}



  • 結果は以下の通り

  • 思ったよりも効果がないような気がする。

    メモリ使用量の初期値: 172004[B]
    TypeオブジェクトをListに 233900個 格納後のメモリ使用量: 1436412[B]
    RuntimeTypeHandleに変換後のメモリ使用量: 1174476[B]