gpt4 book ai didi

c# - 有没有更简单的方法在 C# 中给函数一个别名

转载 作者:行者123 更新时间:2023-11-30 22:47:13 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com