背景:在我正在移植的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);
问题:
- 编译器会优化调用,从而使开销最小吗?
- 是否有更简单的方法来创建此类别名?
最佳答案
您可以使用的一个节省时间的方法是使用公共(public)委托(delegate)字段,而不是为每个函数创建方法。只要参数签名相同,您就可以执行以下操作:
public static class Sqlite3
{
public static Action<sqlite3_context> ResultErrorTooBig =
sqlite3_result_error_toobig;
public static Func<T1, T2> AnotherMethod =
sqlite3_another_method;
}
编辑:
如果您需要通过引用传递参数,您可能无法使用那些方便的 Action
和 Func
类。但是,您可以声明自己的委托(delegate)类型,如下所示:
delegate int StatementDelegate(ref sqlite3_stmt pStmt);
然后,在静态 Sqlite3
类中,您可以执行以下操作:
public static StatementDelegate Finalize = sqlite3_finalize;
关于c# - 在 C# 中是否有更简单的方法为函数指定别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315468/