C# 重新加载页面时释放静态变量或使用其他内容

C# 重新加载页面时释放静态变量或使用其他内容,c#,performance,inheritance,C#,Performance,Inheritance,我通常不写C,当我写的时候,我很烂 我有父类和两个派生类。两个派生类共享一个昂贵的计算,这与第二个类略有不同。我试图避免计算一个。 然而,我想要 interface ICalculator { double getValue(int id); void setContext(int c); } abstract class CalculatorBase: ICalculator { internal static Dictionary<int, double&g

我通常不写C,当我写的时候,我很烂

我有父类和两个派生类。两个派生类共享一个昂贵的计算,这与第二个类略有不同。我试图避免计算一个。 然而,我想要

interface ICalculator 
{
    double getValue(int id);
    void setContext(int c);
}

abstract class CalculatorBase: ICalculator
{
    internal static Dictionary<int, double> output = null;

    internal void loadData()
    {
        //load data
    }

    internal computeAll()
    {
        //do expenseive calculation and set output
        output = something
    }

    double abstract getValue(int id);
    void abstract setContext(int c);
}

class ChildCalculator1 : CalculatorBase 
{
    override void setContext(int c)
    {
         if (output !=null)
             return;
         loadData();
         computeAll();
    }

    public ovverride getValue(int id)
    {
          return output[id];
    }
}

class ChildCalculator2 : CalculatorBase 
{
    override void setContext(int c)
    {
        if (output !=null)
            return;
         loadData();
         computeAll();
    }

    public ovverride getValue(int id)
    {
        return output[id] -1;
    }
}
接口计算器
{
双getValue(int-id);
void setContext(int c);
}
抽象类计算器库:ICalculator
{
内部静态字典输出=null;
内部void loadData()
{
//加载数据
}
内部计算机
{
//进行费用计算并设置输出
输出=某物
}
双抽象getValue(int-id);
无效抽象setContext(intc);
}
类ChildCalculator1:CalculatorBase
{
重写void setContext(int c)
{
if(输出!=null)
回来
loadData();
computeAll();
}
公共OVERRIDE getValue(整数id)
{
返回输出[id];
}
}
类ChildCalculator2:CalculatorBase
{
重写void setContext(int c)
{
if(输出!=null)
回来
loadData();
computeAll();
}
公共OVERRIDE getValue(整数id)
{
返回输出[id]-1;
}
}
要求:

  • 如果调用ChildCalculator1或ChildCalculator或两者(一个接一个),则computeAll将计算一次
  • 然而,如果你重新加载这个页面,我想计算一次。这意味着我希望每个页面加载计算一次
  • 问题:如何从两个不同的子实例(ChildCalculator1,ChildCalculator)访问父属性(输出),并且如果重新加载页面,将重新计算该属性(输出)?目前,我将输出设置为静态,但当我重新加载页面时,这不会改变


    静态变量可能不是正确的选择,因为它们在整个应用程序(而不是页面加载)中都存在。页面加载完成后,或者您可以建议的任何其他操作后,我如何处理?

    您的代码还不错。。。但肯定会更好。:)

    静态字典不会被垃圾收集,这是正确的。(在C#垃圾收集器中释放未使用的内存)您需要计算器的所有实例来共享您的字典,并希望在完成后将其处理掉。您可以实现一个构建计算器的小工厂,并为它们提供字典的单个实例。但是,一个非常简单的方法就是手动管理静态字典

    如果在
    CalculatorBase

    public static void DoneWithCalculations()
    {
        // By removing your static reference to your dictionary you
        //  allow the GC to free the memory.
        output = null;
    }
    
    然后,当您使用完计算器(例如在PageLoad末尾)后,您可以调用此静态方法,如下所示

        CalculatorBase.DoneWithCalculations();
    

    这将满足您的需要,并且不会强迫您在C#工作超过您必须的程度。:)

    你的问题是什么?您想知道如何在页面加载后进行处理,但不显示页面代码?那我们能帮什么忙呢?谢谢你抽出时间。问题是:如何从两个不同的子实例(ChildCalculator1,ChildCalculator)访问父属性(输出),并且如果重新加载页面,将重新计算该属性(输出)?目前,我将输出设置为静态,但当我重新加载页面时,这不会改变。
    static
    s是邪恶的,会导致严重的性能下降,并且几乎是反线程安全的。static是一种工具。工具怎么可能是邪恶的?也就是说,有些工具比其他工具更容易伤害自己。。。所以你在使用static的时候要小心。实际上我也开始做类似的事情了。但这种方法的问题是,我必须显式地调用它。@KhanSharp您是否只在页面加载时需要它?如果是这样,这可以简化。这可以在页面加载时完成,也可以在计算完成时完成。那么您真的不能处理输出吗?您需要将其缓存以备将来再次使用?