避免将未更改的变量传递到库中
本文关键字:变量 | 更新日期: 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)
除了使用命名参数之外,您还需要以某种方式在库中存储不会更改的值。
如果这些只是运行时变量,那么你可以使用类变量(如果你的库是一个类)或静态变量(如果不是)。然而,这并不意味着您的库正在存储系统的状态,并且必须在每次调用时验证该状态仍然有效。
要求在每次调用中传递值实际上是一个更简洁的接口,并迫使库的用户以一致的方式工作。