“重置”.NET 应用程序中所有静态变量的最简洁方法

本文关键字:变量 静态 方法 简洁 重置 NET 应用程序 | 更新日期: 2023-09-27 18:30:54

撇开可怕的不谈,如果我有一个 .NET Web 应用程序,其中静态变量分散在多个类中,那么将它们全部"清除"回 null 的最简洁方法是什么。

在我的头顶上,这将是使用

System.Web.HttpRuntime.UnloadAppDomain() 

问题背后的原因——我们正在缓存一些非常大的字典集合,这些集合的创建成本很高,并且在特殊情况下需要重置。

“重置”.NET 应用程序中所有静态变量的最简洁方法

卸载听起来是最简单的方法,但你不想经常这样做;坦率地说,我会非常怀疑这样做的任何常规要求。

如果您想在不卸载的情况下执行此操作,则必须逐案查看以了解其含义。特别是,强行将静态构造函数/类型初始值设定项/静态字段初始值设定项设置为值的 null 可能会彻底破坏您的应用程序。

请注意,静态变量很少适合 Web 应用,除了缓存(然后必须仔细管理)。

如果您确实拥有这样的数据,而不是多个静态变量,则可以查看状态类上的实例变量,该状态类作为伪单例提供帮助 - 那么您只有一个引用来交换每个数据集群。

可能值得考虑的事情是在某个地方有一个事件,静态代码只能在初始化自身时订阅一次,然后在需要时触发该事件,即

myStaticData = new SomeExpensiveThreadSafeCacheDictionary();
GlobalKillSwitch.ResetCache += delegate { myStaticData.Clear(); };

我用这个

    public static void ResetAllStaticsVariables(Type type)
    {
        var fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Public);
        foreach (var fieldInfo in fields)
        {
            fieldInfo.SetValue(null, GetDefault(type));
        }
    }
    public static object GetDefault(Type type)
    {
        if (type.IsValueType)
        {
            return Activator.CreateInstance(type);
        }
        return null;
    }