2

オブジェクトのコレクションがあるとします

List<MyClass> collection = new List<MyClass>();

そして、これらのオブジェクトが挿入される辞書

Dictionary<string, List<MyClass>> sections = new Dictionary<string, List<MyClass>>();
// example of insertion
sections["A"].Add(collection[2]);

リストとディクショナリは に格納されますViewState。オブジェクトの識別子をディクショナリに保存し、後で必要になったときにそれらをオブジェクトにバインドする方がメモリにやさしいでしょうか?

Dictionary<string, List<int>> sections = new Dictionary<string, List<int>>();
// example of insertion
sections["A"].Add(collection[2].ID);

私が理解しているように、最初のケースではディクショナリにサイズが 32/64 ビットの参照が含まれるため、パフォーマンスが向上することはありません。本当ですか?

編集

MyClass構造体ではなくクラスです。List と Dictionary は次のように宣言されます。

private List<MyClass> A
{
    get
    {
        if (ViewState["a"] == null)
        {
            ViewState["a"] = // retrieve data from db
        }
        return (List<MyClass>)ViewState["a"];
    }
    set
    {
        ViewState["a"] = value;
    }
}

private Dictionary<string, List<MyClass>> B
{
    get
    {
        if (ViewState["b"] == null)
        {
            ViewState["b"] = new Dictionary<string, List<MyClass>>();
        }
        return (Dictionary<string, List<MyClass>>)ViewState["b"];
    }
    set
    {
        ViewState["b"] = value;
    }
}
4

1 に答える 1

0

オブジェクトの識別子をディクショナリに保存し、後で必要になったときにそれらをオブジェクトにバインドする方がメモリにやさしいでしょうか?

「メモリに優しい」とは、「ビューステートが小さい」ことを意味し、ページサイズが小さいこと、レンダリングが高速であること、ブラウザ操作がより効率的であることを意味します...

はい、複合型の ID のみを格納すると、ViewState 文字列は、オブジェクト グラフ全体をシリアル化するよりも小さくなります。これについて考えて、盲目的に ViewState に入れないようにするのは良いことです (よくある間違い)。

いくつかのこと:

  • ViewState は改ざんの影響を受けないため、攻撃者はアクセス権のないオブジェクトの ID を送信しようとする可能性があります。EnableViewStateMac抑止力として使えます。ユーザーがそれらにアクセスできることを確認するために、重要な ID を手動で検証します。

  • これらのオブジェクトを頻繁に使用する場合は、データベースに多数の呼び出しを行うよりも、データベースにSession格納する方がよい場合があります。Cache

于 2013-03-27T17:09:25.070 に答える