如何修复这个设计糟糕的代码
本文关键字:代码 何修复 | 更新日期: 2023-09-27 18:37:25
我有这个代码:
private void timer1_Tick(object sender, EventArgs e)
{
#region BaseAddress
Process[] test = Process.GetProcessesByName(process); //Get process handle
if (test.Any())
{
int Base = test[0].MainModule.BaseAddress.ToInt32();
}
#endregion
//lots of other code blocks
}
我现在想将区域"BaseAddress"从timer1_Tick控件中删除,以使代码更高效,并在程序开始时运行一次。此控件中的其他代码经常使用变量"Base",例如,使它全局可访问而无需返回所有使用 Base 并执行类似 MyGlobals.Base 的操作的最佳方法是什么?
延迟将地址加载到静态变量中。 在您第一次使用它之前,它不会初始化,然后在应用程序的生命周期内保留在内存中。
public static MyGlobals
{
private static readonly Lazy<int> _processBase = new Lazy<int>(() => GetProcessBase("MyProcessName"));
// I don't recommend using the word Base, but OK...
public static int Base { get { return _processBase.Value; } }
private static int GetProcessBase(string processName)
{
int b = 0;
Process[] p = Process.GetProcessesByName(processName);
if(p != null && p.Length > 0)
{
b = p[0].MainModule.BaseAddress.ToInt32();
}
return b;
}
}
在应用程序的其他部分...
private void timer1_Tick(object sender, EventArgs e)
{
if(MyGlobals.Base > 0)
{
// TODO: change "Base" to "MyGlobals.Base" in code below or it won't compile...
//lots of other code blocks
}
}
在这种情况下,
我将使用的方法是创建一个具有 Base 属性的单例类 ProcessFetcher(例如)。
我的类将有一个fetch()函数和isDataPresent属性。
您可以决定手动调用 fetch 或将其放在构造函数上。