2

背景:在我移植的API中,有大量以sqlite3_为前缀的函数。它们被封装在一个名为Sqlite3的类中,所以函数调用为Sqlite3.sqlite3_...

我创建了许多别名调用,类似于以下内容,

//C# alias for call    
public static void result_error_toobig(sqlite3_context pCtx)
{ sqlite3_result_error_toobig(pCtx); }

//Native call   
public static void sqlite3_result_error_toobig(sqlite3_context pCtx)
{
  Debug.Assert(sqlite3_mutex_held(pCtx.s.db.mutex));
  pCtx.isError = SQLITE_ERROR;
  setResultStrOrError(pCtx, "string or blob too big", -1,
  SQLITE_UTF8, SQLITE_STATIC);
}

这允许我编写代码,例如 Sqlite3.result_error_toobig(pCtx);

问题:

  • 编译器会优化调用,因此开销最小吗?
  • 有没有更简单的方法来创建这种类型的别名?
4

2 回答 2

3

您可以采用的一种节省时间的方法是使用公共委托字段,而不是为每个函数创建方法。只要参数签名相同,您就可以执行以下操作:

public static class Sqlite3
{
    public static Action<sqlite3_context> ResultErrorTooBig =
        sqlite3_result_error_toobig;
    public static Func<T1, T2> AnotherMethod = 
        sqlite3_another_method;
}

编辑:

如果你需要通过引用传递参数,你可能无法使用那些方便的ActionFunc类。但是,您可以声明自己的委托类型,如下所示:

delegate int StatementDelegate(ref sqlite3_stmt pStmt);

然后,在您的静态Sqlite3类中,您可以执行以下操作:

public static StatementDelegate Finalize = sqlite3_finalize;
于 2010-02-23T01:30:50.383 回答
0

编译器会优化调用,因此开销最小吗?

是的,编译器将优化调用并有效地删除您的包装方法。编辑:在发布模式下它会得到优化,调试模式不会。

有没有更简单的方法来创建这种类型的别名?

根据您需要创建的别名数量,您可以在 Visual Studio 中编写一个宏来为您完成重复工作。仅取决于编写宏是否需要更长的时间。

PK

于 2010-02-23T01:16:36.747 回答