2010-02-23 29 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

相關問題