ASP.NET Web Forms – Hashtable 对象

在 ASP.NET Web Forms 中,Hashtable 是 .NET Framework 中最经典的键值对集合类,位于 System.Collections 命名空间。它是非泛型集合,键和值都是 object 类型,因此可以存放任何数据,但性能和类型安全较差(需要装箱/拆箱)。

虽然现在更推荐使用泛型 Dictionary<TKey,TValue>,但在很多老的 Web Forms 项目(尤其是 .NET Framework 4.8 及以下)中仍然大量使用 Hashtable,特别是以下场景:

常见使用场景(ASP.NET Web Forms)

  1. 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;
  1. Session 和 Application 状态管理
   // Session
   Session["ShoppingCart"] = new Hashtable();

   // Application(全局缓存)
   if (Application["OnlineUsers"] == null)
       Application["OnlineUsers"] = new Hashtable();
  1. Cache 对象(System.Web.Caching.Cache)
   Cache.Insert("MyData", 
                new Hashtable(), 
                null, 
                DateTime.Now.AddMinutes(20), 
                Cache.NoSlidingExpiration);
  1. 控件属性绑定、动态配置表等

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(现代推荐)

特性HashtableDictionary
命名空间System.CollectionsSystem.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 时代仍然是“标配”之一。

有具体使用场景需要代码示例吗?比如分页参数保存、购物车、多条件查询筛选器等,我可以给你完整案例。

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部