在页面重新加载时使用静态变量或使用其他内容

时间:2014-03-12 16:00:14

标签: c# performance inheritance

我通常不会编码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;
    }
}

要求:

  1. 如果调用ChildCalculator1或ChildCalculator或两者(一个接一个),computeAll将被计算一次。
  2. 但是,如果您重新加载此页面,我想计算一次。这意味着我想计算每次页面加载次数
  3. 问题:如何从两个不同的子实例(ChildCalculator1,ChildCalculator)访问父属性(输出),如果重新加载页面,将重新计算该proproperty(输出)?目前我将输出设置为静态,但是当我重新加载页面时这不会改变。

    静态变量可能不是正确的,因为它们在应用程序中存活而不是页面加载。如何在完成页面加载或您可以建议的任何其他内容后处理?

1 个答案:

答案 0 :(得分:0)

你的代码并不是那么糟糕......但它肯定会更好。 :)

你是正确的,静态字典不会被垃圾收集。 (在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#中工作。 :)