【发布时间】:2010-11-08 15:54:34
【问题描述】:
在构建自定义控件时,我看到了两种使用视图状态的模式。一种是使用属性将视图状态访问伪装成持久数据。
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 将所有这些都组合到一个地方。
然后呢?
【问题讨论】: