创建保存强制类型转换的变量会节省开销吗?
本文关键字:节省 开销 变量 保存 类型转换 创建 | 更新日期: 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;
}
}