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

时间:2012-04-13 08:19:14

标签: c# asp.net static-members

除了可怕之外,如果我有一个.NET webapp,其中静态变量分散在多个类中,那么将它们“清除”的最佳方法是将其全部恢复为null。

在我的脑海中,我们将使用

重新启动应用程序
System.Web.HttpRuntime.UnloadAppDomain() 

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

2 个答案:

答案 0 :(得分:5)

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

如果你想在没有卸载的情况下这样做,你必须根据具体情况来了解其含义。特别是,通过静态构造函数/类型初始值设定项/静态字段初始值设定项强制将某些内容设置为null可能会彻底破坏您的应用程序。

请注意,静态变量很少适用于Web应用程序,除了缓存(然后必须小心管理)。

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

可能值得考虑的事情是在静态代码可以在初始化时自己订阅一次,然后在需要时触发事件,即< / p>

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

答案 1 :(得分:0)

我用这个

    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;
    }