C# 如何修复这个设计糟糕的代码

C# 如何修复这个设计糟糕的代码,c#,C#,我有以下代码: 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.Ba

我有以下代码:

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\u Tick控件中去掉,以提高代码的效率,并在程序开始时运行一次。此控件中的其他代码频繁使用变量“Base”,在不必返回使用Base的所有实例并执行类似MyGlobals.Base的操作的情况下,使其全局可访问的最佳方法是什么,例如?

在本例中,我将使用的方法是创建一个带有Base属性的单例类ProcessFetcher(例如)

我的类将有一个fetch()函数和isDataPresent属性


您可以决定手动调用fetch或将其放在构造函数上。

延迟将地址加载到静态变量中。在您第一次使用它之前,它不会初始化,然后将在应用程序的生命周期中保留在内存中

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;
    }
}

确切地说,为什么这个代码首先存在?它的意义是什么?获取正在运行的进程的基址以在ReadProcessMemory中使用。首先,将该名称
base
重构为不同的名称。仅仅因为C#区分大小写并不是像保留关键字那样命名变量的好理由。@user1166981-虽然从技术上讲是允许的,但它通常不受欢迎,因为它与类表示法冲突,使代码更难阅读。通常在.NET中,类以
PascalCase
样式命名,变量以
camelCase
样式命名(请注意开头的小写字母“c”。@user1166981-问题不在于大小写。问题在于您使用的单词
Base
。小写形式为
Base
。在保留关键字后命名变量比使用错误的大小写约定要大得多。我是否还需要修改所有其他的r引用基的代码?一个简单的替换应该可以做到:基=>ProcessFetcher.Instance.BaseI获取错误仍然:当前上下文中不存在MainModule,并且计时器控件中所有其他代码块的当前上下文中不存在相同的基抱歉..从内存中徒手编码。我修复了它。好,现在是MainModule错误已消失,但原始基不存在错误贯穿整个计时器控件更改“基”everywhere to _processBase.Value,或者将您正在使用的变量设置为_processBase.Value。我没有其他代码来更正这些错误。啊。我希望避免阅读所有代码,因为我将只将Base设置为全局,然后将所有Base替换为MyGlobals.Base。无论如何,感谢您的帮助。
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 
    }
}