C# 重新加载页面时释放静态变量或使用其他内容
我通常不写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
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;
}
}
要求:
静态变量可能不是正确的选择,因为它们在整个应用程序(而不是页面加载)中都存在。页面加载完成后,或者您可以建议的任何其他操作后,我如何处理?您的代码还不错。。。但肯定会更好。:) 静态字典不会被垃圾收集,这是正确的。(在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您是否只在页面加载时需要它?如果是这样,这可以简化。这可以在页面加载时完成,也可以在计算完成时完成。那么您真的不能处理输出吗?您需要将其缓存以备将来再次使用?