避免将未更改的变量传递到库中

本文关键字:变量 | 更新日期: 2023-09-27 17:54:34

我正在制作一个库,它将执行读取进程内存的操作,并从该进程获取信息。

我遇到的问题是,要调用函数,我每次都必须传递很多变量,即使它们的值没有改变。

例如,ReadProcessMemory要求我通过:

  • 过程处理
  • 内存地址
  • 主模块基址
  • 读取的字节数

每次读取唯一会改变的是内存地址,所以我不需要在每次调用函数时传递其余的变量(我实际上有3个函数可以通过这种方式减少,并且可能很快会有更多)。

谁能给我一个简短的解释,我应该怎么做这件事?变量是否存在于运行时,所以我可以直接从DLL文件调用函数并使用它们?

避免将未更改的变量传递到库中

可以在调用带有可选参数的方法时使用命名参数。

public void MyMethod(string s = null, int i = 0, MyType t = null)
{ 
    /* body */ 
}

这样写:

MyMethod(i: 10, t: new MyType());
MyMethod("abc");
MyMethod("abc", t: new MyType());

或者你可以使用重载:

public void MyMethod(string s)
{
    MyMethod(s, 0, null);
}
public void MyMethod(int i)
{
    MyMethod(null, i, null);
}
public void MyMethod(MyType t)
{
    MyMethod(null, 0, t);
}
public void MyMethod(string s = null, int i = 0, MyType t = null)
{ 
    /* body */ 
}

另一个选择是使用如下的parameters类:

public class MyParametersClass
{
    public string s { get; set; }
    public int i { get; set; }
    public MyType t { get;set; }
    public MyParametersClass()
    {
        // set defaults
        s = null;
        i = 0;
        MyType = null;
    }
}
public void MyMethod(MyParametersClass c)
{ 
    /* body */ 
}

像这样调用:

MyMethod(new MyParametersClass 
{
    i = 25,
    t = new MyType()
});

使用parameters类可能是您首选的方法。无论处理什么,都可以携带parameters类。:)对它所做的任何更改都不会丢失…

var parameters = new MyParametersClass();
MyMethod(parameters);
parameters.i = 26;
MyMethod(parameters);

一种方法是将方法调用转换为对象,并在该对象中缓存参数。被称为重构为"方法对象"

近似样本(Tx -是一些类型):

 int My.ReadProcessMemory(T1 a1, T2 a2, T3 variable)
 {...}

 class ReadProcessMemory
 {
      T1 a1;
      T2 a2;
      public ReadProcessMemory(T1 a1, T2 a2)
      {
         this.a1 = a1;
         this.a2 = a2;
      }
      public int Run(T3 variable)
      {
         return My.ReadProcessMemory(a1, a2, variable);
      }
 }

为这个写一个包装器类…将变量设置为"new thing(…)"的属性或参数,然后随后的调用是thing. read (MemoryAddress)

除了使用命名参数之外,您还需要以某种方式在库中存储不会更改的值。

如果这些只是运行时变量,那么你可以使用类变量(如果你的库是一个类)或静态变量(如果不是)。然而,这并不意味着您的库正在存储系统的状态,并且必须在每次调用时验证该状态仍然有效。

要求在每次调用中传递值实际上是一个更简洁的接口,并迫使库的用户以一致的方式工作。