2010-02-23 75 views
2

背景:在我正在移植的API中,有大量函数以sqlite3_为前缀。他们被封装在一个名为SQLITE3类,因此函数调用Sqlite3.sqlite3 _...有没有一种更简单的方法给一个函数在C#中的别名名称

我已经创建了一些别名通话,类似于以下的,

//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);

问题:

  • 将编译器优化了通话,所以开销最小?
  • 有没有更简单的方法来创建这种类型的别名?
+0

你为什么不使用现有的SQLite ADO.NET提供程序在这里可用? http://sqlite.phxsoftware.com/ – 2010-02-23 01:05:09

+0

这实际上是将SQLite转换为托管代码(http://code.google.com/p/csharp-sqlite)的端口,而不是ADO提供程序。无论如何,我仍然在学习C#的一些更微妙的特质,而这个问题只是在烦扰我。这就是全部 – Noah 2010-02-23 01:08:56

+0

无法回答主要问题,但对于优化:如果以发布模式编译,编译器应该内联这些方法。在调试模式下,这不会发生,这是预期的和良好的。 – 2010-02-23 01:14:33

回答

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; 
+0

这很好,谢谢。跟进,如果你有时间。 什么是正确的语法,当该函数有一个引用,如公共静态int sqlite3_finalize(ref sqlite3_stmt pStmt) public static Func Finalize = sqlite3_finalize; 似乎不起作用。 – Noah 2010-02-24 01:37:30

+0

看到我未经测试的编辑。基本上,你可以定义你自己的委托类型。 – Jacob 2010-02-24 02:59:51

+0

+1后续 – Noah 2010-02-24 06:25:58

0

编译器是否会优化调用,所以开销最小?

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

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

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

PK

相关问题