3

Scitech の .Net Memory Profiler を使用して、アプリ (WinXP 64 で実行) の一部をチェックしています。アプリが使用するリストのライブ インスタンスが 1 つだけあり、常に 32 バイトで、配列として表示されるケースをよく見かけます (Product[] など)。

インスタンスをよく見ると、何からも参照されていないように見えます。[ルート パスに含まれるインスタンスのみを表示] チェックボックスをオンのままにすると、参照先リストが空になります。そのチェックボックスをオフにすると、次のみが表示されます。

Object[]    #307[9126]
    <GCHandle>  #306 {Pinned}

割り当てコール スタックは次のようになります。

mscorlib!System.Collections.Generic.List<T>..cctor()
[Skipped frame(s)]
mscorlib!System.Collections.ObjectModel.Collection<T>..ctor()
MyApp.ProductsAdmin!MyApp.ProductsAdmin.ViewModels.ProductsAdminViewModel..ctor() ProductsAdminViewModel.cs

空のリストの構築で終わったようです。ルート パスにインスタンスが含まれておらず、すべてピン留めされているとはどういう意味ですか?

4

1 に答える 1

3

その理由は、List 静的コンストラクターが T の空の配列を割り当てるためです。Reflector を使用してそのコードを見てください。

static List()
{
    List<T>._emptyArray = new T[0];
}
于 2012-04-27T08:37:48.990 に答える