在构建自定义控件中,我看到了两种使用视图状态的模式。一种是使用属性将视图状态访问伪装为持久数据。
public bool AllowStuff
{
get
{
return (ViewState[constKeyAllowStuff] != null) ?
(bool)ViewState[constKeyAllowStuff] : false;
}
set { ViewState[constKeyAllowStuff] = value; }
}
另一种方法是使用私有成员字段,重写控件上的Load/SaveViewState方法,并显式处理所有这些方法:
protected override object SaveViewState()
{
object[] myViewState = new object[2];
myViewState[0] = base.SaveViewState();
myViewState[1] = _allowStuff;
return myViewState;
}
protected override void LoadViewState(object savedState)
{
object[] stateArray = (object[])savedState;
base.LoadViewState(stateArray[0]);
_allowStuff = (bool)stateArray[1];
}
(为了清晰起见,我删去了很多安全检查,所以忽略了这一点。)
一种方法比另一种方法有特别的优势吗?我看不出他们在性能方面有什么不同。版本1是懒惰的,所以我想如果您在一次传递中不需要那个特定的值,您可以节省一点。版本1也更抽象,更好地隐藏细节。版本2更清楚地说明了数据何时是有效的,并且可以读取或修改(在加载和保存之间),因为它在ASP.NET生命周期内更清晰地工作。
版本2确实需要更多的样板代码(一个属性、一个支持私有字段和两个地方的视图状态处理),而不是版本1将所有这些合并到一个地方。
然后思考?