我正在创建一个库,它将执行读取进程内存的操作,并从所述进程中获取信息。
我遇到的问题是,要调用函数,我每次都要传递很多变量,即使它们的值没有改变。
例如,ReadProcessMemory
要求我通过:
每次读取唯一会改变的是内存地址,所以每次调用函数时我都不需要传递其余的变量(我实际上有3个函数可以在这里减少)方式,可能会有更多)。
有人能给我一个简短的解释,我该如何解决这个问题?变量是否存在于运行时,因此我可以直接调用该函数并从DLL文件中使用它们?
答案 0 :(得分:2)
使用可选参数调用方法时,可以使用命名参数。
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 */
}
另一种选择是使用如下的参数类:
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()
});
使用参数类可能是您的首选方法。在处理您正在处理的任何内容时,可以随身携带参数类。 :)对它做出的任何更改都不会丢失......
var parameters = new MyParametersClass();
MyMethod(parameters);
parameters.i = 26;
MyMethod(parameters);
答案 1 :(得分:1)
一种方法是将方法调用转换为对象,并在这样的对象中缓存参数。被称为refactoring to "method object"。
近似样本(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);
}
}
答案 2 :(得分:1)
为此编写一个包装类...将变量设置为“new thing(...)”的属性或parms,然后后续调用是thing.Read(MemoryAddress)
答案 3 :(得分:1)
除了使用命名参数外,您还需要以某种方式存储库中未更改的值。
如果这些只是运行时变量,那么您可以只使用类变量(如果您的库是类)或静态变量(如果不是)。但是,这意味着您的库正在存储系统的状态,并且必须验证状态在每次调用时仍然有效。
要求在每次调用中传递的值实际上是一个更清晰的界面,并强制您的库的用户以一致的方式工作。