我通常不会编码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;
}
}
要求:
问题:如何从两个不同的子实例(ChildCalculator1,ChildCalculator)访问父属性(输出),如果重新加载页面,将重新计算该proproperty(输出)?目前我将输出设置为静态,但是当我重新加载页面时这不会改变。
静态变量可能不是正确的,因为它们在应用程序中存活而不是页面加载。如何在完成页面加载或您可以建议的任何其他内容后处理?
答案 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#中工作。 :)