当我需要在我的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
}
答案 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;
}
}