创建保存强制类型转换的变量会节省开销吗?

本文关键字:节省 开销 变量 保存 类型转换 创建 | 更新日期: 2023-09-27 18:12:35

当我需要在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
   }

创建保存强制类型转换的变量会节省开销吗?

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

在第二种情况下(多次使用MyList),每次使用它时都将在会话中查找该值。它也是类型转换,但是可能比会话查找更便宜。

从根本上说,我认为第一个版本更简洁,因为它使您更清楚地看到您试图多次重用相同的值。

当然避免强制转换更有效。

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

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; 
                }
     }