Есть ли более простой способ присвоить функции псевдоним в C # - PullRequest
2 голосов
/ 23 февраля 2010

ПРЕДПОСЫЛКИ: В 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);

ВОПРОС:

  • Будет ли компилятор оптимизировать вызов, поэтому издержки будут минимальными?
  • Есть ли более простой способ создать этот тип псевдонима?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

Можно сэкономить время, используя открытые поля делегатов, а не создавая методы для каждой функции. Пока подписи параметров одинаковы, вы можете сделать что-то вроде этого:

public static class Sqlite3
{
    public static Action<sqlite3_context> ResultErrorTooBig =
        sqlite3_result_error_toobig;
    public static Func<T1, T2> AnotherMethod = 
        sqlite3_another_method;
}

Edit:

Если вам нужно передать параметры по ссылке, вы, вероятно, не сможете использовать эти удобные Action и Func классы. Однако вы можете объявить свои собственные типы делегатов, например:

delegate int StatementDelegate(ref sqlite3_stmt pStmt);

Тогда в вашем статическом Sqlite3 классе вы можете сделать что-то вроде этого:

public static StatementDelegate Finalize = sqlite3_finalize;
0 голосов
/ 23 февраля 2010

Будет ли компилятор оптимизировать вызов, поэтому издержки будут минимальными?

Да, компилятор оптимизирует вызов и эффективно удалит ваш метод-обертку. Редактировать: в режиме релиза он будет оптимизирован, в режиме отладки - нет.

Есть ли более простой способ создать этот тип псевдонима?

В зависимости от количества псевдонимов, которые вам нужно создать, вы можете написать макрос в Visual Studio, чтобы выполнить повторную работу за вас. Просто зависит от того, потребуется ли больше времени для написания макроса или нет.

рк

...