2

背景:私が移植している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);のようなコードを記述できます。

質問:

  • コンパイラーは呼び出しを最適化するので、オーバーヘッドは最小限に抑えられますか?
  • このタイプのエイリアスを作成する簡単な方法はありますか?
4

2 に答える 2

3

使用できる時間の節約は、関数ごとにメソッドを作成するのではなく、パブリックデリゲートフィールドを使用することです。パラメータのシグネチャが同じである限り、次のようなことができます。

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 int StatementDelegate(ref sqlite3_stmt pStmt);

次に、静的Sqlite3クラスで、次のようなことを行うことができます。

public static StatementDelegate Finalize = sqlite3_finalize;
于 2010-02-23T01:30:50.383 に答える
0

コンパイラーは呼び出しを最適化するので、オーバーヘッドは最小限に抑えられますか?

はい、コンパイラは呼び出しを最適化し、ラッパーメソッドを効果的に削除します。編集:リリースモードでは最適化されますが、デバッグモードでは最適化されません。

このタイプのエイリアスを作成する簡単な方法はありますか?

作成する必要のあるエイリアスの数に応じて、Visual Studioでマクロを記述して、繰り返し作業を行うことができます。マクロの作成に時間がかかるかどうかによって異なります。

pk

于 2010-02-23T01:16:36.747 に答える