创建变量以保存强制转换保存开销

时间:2013-05-08 16:10:38

标签: c# asp.net properties casting

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

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

然后我将一个我的对象列表放在那里,然后在稍后的回发中调用它。我认为这是一种非常标准的方法,可以使对象的持续时间超过LifeCycle页面。

但是我的问题是,当我不止一次使用List时,说我要用它做一些事情,我不禁想到每次我访问它时,它都会投射一个对象列表&lt;&gt;但如果我创建一个变量,它看起来就像是在避免投射。

   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
   }

2 个答案:

答案 0 :(得分:2)

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

在第二种情况下(多次使用MyList),每次使用时,您都会在会话中查看值。它也在投射,但可能比会话查找便宜。

从根本上说,我认为第一个版本更干净,因为它更清楚你试图多次重复使用相同的值。

答案 1 :(得分: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; 
                }
     }