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

时间:2013-01-18 23:13:10

标签: c# parameters refactoring

我正在创建一个库,它将执行读取进程内存的操作,并从所述进程中获取信息。

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

例如,ReadProcessMemory要求我通过:

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

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

有人能给我一个简短的解释,我该如何解决这个问题?变量是否存在于运行时,因此我可以直接调用该函数并从DLL文件中使用它们?

4 个答案:

答案 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)

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

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

要求在每次调用中传递的值实际上是一个更清晰的界面,并强制您的库的用户以一致的方式工作。