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,以确保用户可以访问它们。

  • 如果您经常使用这些对象,则最好将它们存储在数据库中SessionCache而不是对数据库进行多次调用。

于 2013-03-27T17:09:25.070 回答