c# - 在 C# 中是否有更简单的方法为函数指定别名

标签 c# alias function-calls

背景:在我正在移植的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;
}

编辑:

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

delegate int StatementDelegate(ref sqlite3_stmt pStmt);

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

public static StatementDelegate Finalize = sqlite3_finalize;

关于c# - 在 C# 中是否有更简单的方法为函数指定别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315468/

相关文章:

c# - 在静态构造函数中初始化静态变量而不是直接赋值有什么好处

linux - 双引号在别名中转义

java - 创建 Artifact 别名而不复制完整的项目模块

c# - 使用 Rx 无限重复异常

c# - UITabBar 或 UITabBarItem 的触摸事件

php - 命名空间常量和用途

python - 在 Python 中传递具有多个返回值的函数作为参数

c - 使用 ptrace 检测调用的偏移量

Python:函数和参数列表....这可能吗?

c# - 无需重新编译项目的本地化