在 ASP.NET Web Forms 中,Hashtable 是 .NET Framework 中最经典的键值对集合类,位于 System.Collections 命名空间。它是非泛型集合,键和值都是 object 类型,因此可以存放任何数据,但性能和类型安全较差(需要装箱/拆箱)。
虽然现在更推荐使用泛型 Dictionary<TKey,TValue>,但在很多老的 Web Forms 项目(尤其是 .NET Framework 4.8 及以下)中仍然大量使用 Hashtable,特别是以下场景:
常见使用场景(ASP.NET Web Forms)
- ViewState(最经典)
// 在 Page 中保存跨回发的数据
private Hashtable UserFilters
{
get
{
if (ViewState["UserFilters"] == null)
ViewState["UserFilters"] = new Hashtable();
return (Hashtable)ViewState["UserFilters"];
}
set { ViewState["UserFilters"] = value; }
}
// 使用
UserFilters["Name"] = txtName.Text;
UserFilters["Status"] = ddlStatus.SelectedValue;
- Session 和 Application 状态管理
// Session
Session["ShoppingCart"] = new Hashtable();
// Application(全局缓存)
if (Application["OnlineUsers"] == null)
Application["OnlineUsers"] = new Hashtable();
- Cache 对象(System.Web.Caching.Cache)
Cache.Insert("MyData",
new Hashtable(),
null,
DateTime.Now.AddMinutes(20),
Cache.NoSlidingExpiration);
- 控件属性绑定、动态配置表等
Hashtable 基本操作示例
using System.Collections;
protected void Page_Load(object sender, EventArgs e)
{
Hashtable ht = new Hashtable();
// 添加
ht["Name"] = "张三";
ht["Age"] = 28;
ht["IsVip"] = true;
ht.Add("Id", 1001); // 也可用 Add 方法
// 读取
if (ht.ContainsKey("Name"))
{
string name = ht["Name"].ToString();
// 或
string name2 = ht["Name"] as string;
}
// 修改
ht["Age"] = 30;
// 删除
ht.Remove("IsVip");
// 遍历
foreach (DictionaryEntry entry in ht)
{
Response.Write($"{entry.Key} = {entry.Value}<br/>");
}
// 清空
ht.Clear();
}
线程安全问题(重要!)
Hashtable 本身是线程安全的(多线程读取安全,写入时自动加锁),适合用在:
Application对象Cache对象- 静态变量
示例(推荐写法安全):
Hashtable onlineUsers = Application["OnlineUsers"] as Hashtable;
lock (onlineUsers.SyncRoot) // 推荐加锁,性能更好
{
onlineUsers[Session.SessionID] = DateTime.Now;
}
或直接使用其内置锁:
Hashtable onlineUsers = Application["OnlineUsers"] as Hashtable;
onlineUsers[Session.SessionID] = DateTime.Now; // Hashtable 本身已同步
Hashtable vs Dictionary(现代推荐)
| 特性 | Hashtable | Dictionary |
|---|---|---|
| 命名空间 | System.Collections | System.Collections.Generic |
| 泛型/类型安全 | 无(object) | 有(但值仍是 object) |
| 性能 | 有装箱/拆箱,较慢 | 无装箱(键是 string),更快 |
| 线程安全 | 是(内置同步) | 否(需手动 lock) |
| 适用于老项目 | 非常常见 | .NET 2.0+ 推荐 |
如果你在维护老项目,继续用 Hashtable 没问题;
如果你新建 Web Forms 项目(.NET Framework),建议使用:
// 推荐写法(类型安全 + 高性能)
private Dictionary<string, object> Filters
{
get { return ViewState["Filters"] as Dictionary<string, object> ?? new Dictionary<string, object>(); }
set { ViewState["Filters"] = value; }
}
总结
在 ASP.NET Web Forms 中你还会经常看到 Hashtable,尤其在:
- ViewState、Session、Application、Cache
- 老项目、第三方控件源码
- 需要线程安全的全局键值集合时
它是 .NET 1.0 时代的“万能容器”,虽然现在被泛型取代,但在 Web Forms 时代仍然是“标配”之一。
有具体使用场景需要代码示例吗?比如分页参数保存、购物车、多条件查询筛选器等,我可以给你完整案例。