0

当我需要在我的 Asp.Net 项目的回发之间保存大量自定义对象时,我喜欢将它们保存在会话变量中,然后将它们转换为属性中的 List<> 类似这样的东西

    public partial class MyPage : Page
    {
         private List<MyStorageObject> MyList
         {
                get {return (List<MyStorageObject>) Session["MySessionString"]; }
                set { Session["MySessionString"] = value; }
         }
    }

然后我把我的对象列表放在那里,并在以后的回发中调用它。我认为这是使对象持续时间比页面生命周期更长的一种非常标准的方法。

但是我的问题是,当我不止一次使用 List 时,说我要用它做一些事情,我不禁想到每次访问它时,它都会将一个对象投射到 List< > 但如果我创建一个变量,它看起来就像是在避免强制转换。

   private void DoStuffWithMyList()
   {
       var x = MyList;

       //Assuming I'm going to call the list 20 times in my method
       x.first();      // Is this any more efficient / cleaner
       MyList.first(); // Than this?

       //Or do they both get converted into the same thing in the end anyway
   }
4

2 回答 2

2

是的,在第一种情况下(使用x),您只访问该属性一次,然后重用返回的值。

在第二种情况下(MyList多次使用),您每次使用时都会在会话中查找该值。它也是铸造的,但这可能比会话查找便宜。

从根本上说,我认为第一个版本更干净,因为它更清楚地表明您正在尝试多次重用相同的值。

于 2013-05-08T16:14:22.980 回答
1

当然,避免铸造更有效。

为什么不将两者结合起来?:

private List<MyStorageObject> _MyList = null;
private List<MyStorageObject> MyList
     {
            get {
                if (this._MyList == null)
                {
                    this._MyList = (List<MyStorageObject>)Session["MySessionString"];
                }
                return this._MyList;
                }
            set {
                this._MyList = value;
                Session["MySessionString"] = value; 
                }
     }
于 2013-05-08T16:17:07.960 回答